2010-10-26 3 views
2

Je n'arrive pas à trouver la bonne réponse à mon problème. Je suis submergé par les informations que je trouve sur internet, et je n'ai aucune idée de ce que je devrais faire.JSP - Impossible de maintenir la session entre la page http et la page https

Ma configuration est la suivante: serveur Apache (frontal), Tomcat 6.0 (en arrière), certificat RapidSSL est sur le serveur Apache, mon site est composé de Java Server Pages.

Le problème:
J'ai quelques pages qui sont sous https, tandis que le reste des pages du site sont sous http. La page de connexion que j'ai, est sous https, et j'ai remarqué que lorsque je me connecte, et redirige vers une page http, que la session n'est pas maintenue. C'est en créer un nouveau, ce qui fait que l'utilisateur est envoyé à ma page "expirée de la session", alors qu'en réalité, une connexion réussie, ils seraient redirigés vers une page différente.

Questions:
Pourquoi la session ne se maintient pas lors de la mise à http https?

Comment résoudre ce problème? J'ai besoin que les attributs de session créés sur les pages http soient présents sur les pages https, donc lorsque l'utilisateur est redirigé vers une page http, la session n'a pas été recréée et les attributs perdus.

S'il vous plaît poser toutes les questions que vous jugez nécessaires afin de m'aider à comprendre cela. J'apprécie grandement toute aide que je reçois. Cette question est devenue une pierre d'achoppement pour moi, d'autant plus que je manque visiblement de «l'expertise» pour me débrouiller tout seul.

Répondre

0

Utilisez-vous un simple proxy inverse pour vous connecter à Tomcat? Si c'est votre cas, utilisez mod_proxy_ajp pour utiliser AJP pour connecter le serveur HTTP Apache à Tomcat Application Server. Autoriser l'utilisateur à utiliser la même session après la connexion est une faille de sécurité.

+0

Oui, mod_ajp est utilisé sur mon serveur. Il connecte/transmet les demandes de pages JSP à Tomcat ... correct? – katura20

+0

'mod_ajp'? Voulez-vous dire 'mod_proxy_ajp' ou' mod_jk'? Il n'est pas clair quel est l'impact de ceci sur le problème entre HTTPS et HTTP, même comparé à 'mod_proxy_http'. – Bruno

+0

Je suis désolé, oui, c'est mod_jk, pas mod_ajp, mes excuses. – katura20

3

Par défaut, Tomcat n'autorise pas les sessions à migrer des pages SSL vers des pages non SSL.

Vous devez modifier votre logique, donc si un utilisateur se connecte, la session est silencieusement mise à jour et connecté au lieu d'aller à la page expirée de la session.

+0

La meilleure idée que je peux trouver, est de recréer la session att qui ont été perdues, et cela lors de la validation du nom d'utilisateur/mot de passe params, de sorte que la logique des pages ne pense pas que la session a expiré. Cela vous semble-t-il logique? – katura20

+0

J'ai essayé mon idée - j'ai remarqué que lorsque je me connecte la 1ère fois, c'est réussi, mais quand je me déconnecte et que je me reconnecte la 2ème fois, dans la même session, ça fonctionne comme avant, m'envoyer en session expiré. Je dois également mentionner que j'ai utilisé response.encodeURL() pour chaque lien sur mon site. J'ai remarqué que lorsque je suis sur une page http, les liens de type http ont JSESSIONID présent, mais pas les liens https. Est-ce que cela ajoute à mon problème comment? – katura20

1

Il est probable que vous utilisiez des «cookies sécurisés» pour gérer la session: ces cookies ne se propagent pas de HTTPS vers HTTP. C'est généralement une bonne chose.

Vous pouvez choisir de ne pas le faire, mais lorsque vous transférez une session de HTTPS à HTTP, vous devez veiller à ne pas la réutiliser par-dessus HTTPS plus tard, car elle pourrait avoir été compromise.

+0

Je ne crois pas que j'utilise des "cookies sécurisés" uniquement parce que je n'ai rien configuré sur Tomcat pour cela. J'utilise des attributs de session, c'est à peu près tout. – katura20

+0

Les cookies sécurisés sont probablement les paramètres par défaut (ce qui serait raisonnable de toute façon), voir la réponse de Brion Whitlock. – Bruno

0

J'ai le même problème, où certaines parties du site sont https, et certains sont http. J'ai découvert qu'avec Tomcat, les cookies de session créés sur http ne posent aucun problème, mais les cookies de session créés sur https sont perdus lors du passage à http.

Une solution que j'ai trouvée en maintenant une session pendant que l'utilisateur parcourt le site, est de faire rebondir l'utilisateur quand il arrive pour la première fois.J'ai créé un RequestFilter avec le code suivant:

if (request.isSecure() && session.isNew()) { // session cookie created over ssl 
    try { session.invalidate(); } 
    catch (Exception e) { /* handle error */ } 
    String url = request.getRequestURI().replaceFirst("https", "http"); 
    response.sendRedirect(url); 
} 
else if (!request.isSecure()) { 
    String url = request.getRequestURI().replaceFirst("http", "https"); 
    response.sendRedirect(url); 
} 

Cela oblige à de nouvelles sessions non SSL pour créer un cookie de session durable, puis une fois par session existe, l'utilisateur retransférés pour sécuriser demande. Cela a pour résultat que la session reste en vie.

Ou voici une options qui implique moins de rebondir, juste remplacer le cookie de session avec un non sécurisée:

if (request.isSecure() && session.isNew()) { 
    Cookie c = new Cookie("JSESSIONID", request.getSession().getId()); 
    c.setSecure(false); 
    response.addCookie(c); 
} 
Questions connexes