2009-01-12 11 views
12

Je suis actuellement en cours d'exécution d'une application avec les propriétés suivantes:l'appui des sessions sans cookies dans Tomcat

  • basé sur Java avec Spring et Acegi
  • Fonctionnant sur Tomcat 5

J'ai besoin de la capacité pour prendre en charge les sessions utilisateur sans cookies. Quelqu'un pourrait-il me diriger dans la bonne direction?

Merci.

+1

Si pas ce travail hors de la boîte sur Tomcat? le conteneur de servlet doit définir un paramètre de demande JSESSIONID sur la première utilisation du session, un d si le client ne renvoie pas de réponse indiquant qu'il accepte les cookies, le conteneur est supposé continuer à utiliser ce paramètre ... je pense. –

Répondre

18

La réponse complète à cette question est une combinaison de toutes vos réponses, je vais donc résumer:

  1. Il n'y a pas besoin de définir des cookies = « false » dans le fichier context.xml . La fonctionnalité idéale est que tomcat utilise son identification de session basée sur l'URL, qui sera utilisée par défaut si les cookies ne sont pas supportés par l'utilisateur. Lorsqu'un utilisateur n'a pas activé les cookies, tomcat identifie la session par le paramètre "JSESSIONID" à partir de l'URL de la requête. Un échantillon de deux urls sont les suivantes http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 Remarquez comment l'identifiant de session ne fait pas partie de la chaîne de requête url (ce qui est une norme j2ee)

  2. Afin d'assurer le paramètre jsessionid obtient joint en annexe à toute votre demande URL, vous ne pouvez pas avoir de références URL simples. Par exemple, dans JSTL, vous devez utiliser < c: url>. Le moteur de servlet ajoutera automatiquement le jsessionid à l'url si nécessaire. Voici un exemple:

    <% - ce qui est mauvais: -%> < a href = "page.html"> lien </a>

    <% - ce qui est bon: - % H 0 = < c: url value = 'page.html '/> "> lien </a>

+0

Quelle est la façon de le faire si j'utilise les appels ajax? (pas de liens href) – maximus

0

Vous pouvez effectuer le suivi par adresse IP, mais les serveurs proxy (et NAT?) Peuvent vous déranger.

Vous pouvez forcer toutes les URL à avoir la session en tant que paramètre et toutes les formes en tant que champ masqué. Peut-être qu'un tag personnalisé pour générer des URL pourrait aider ici, mais je n'ai pas beaucoup travaillé avec taglibs. Vous devez prendre en compte la sécurité: les personnes peuvent envoyer des liens à quelqu'un d'autre avec l'identifiant de session. Vous devez donc vérifier l'adresse IP de chaque accès pour vérifier que l'adresse correspond à la session.

+0

Je recommande de ne jamais suivre par adresse IP en raison de VPN. Cette réponse est ancienne, donc je ne vais pas downvote, mais je déconseille fortement cela pour les futurs chercheurs de réponse. – azdragon2

4

Voir http://tomcat.apache.org/tomcat-5.5-doc/config/context.html.

Dans un fichier META-INF/context.xml,

<?xml version='1.0' encoding='UTF-8'?> 
<Context path='/myApplicationContext' cookies='false'> 
    <!-- other settings --> 
</Context> 
+1

Cela semble ajouter JSESSIONID à l'URL sur la première demande à l'application. Mais, comment puis-je m'assurer qu'il est ajouté aux demandes ultérieures? –

0

Comme mate b a commenté cela devrait fonctionner hors de la boîte (tomcat essayera les cookies, et si cela ne fonctionne pas retomber sur le codage de la session l'url). Cependant, cela ne fonctionnera pas si vous créez vous-même un lien 'plain' - utilisez toujours une méthode comme celle de JSTL afin que tomcat puisse ajouter le paramètre de tracking à toutes les urls.

0

Le meilleur moyen est d'utiliser URL réécriture. Donc, lorsque vous utilisez request.getSession(), le container enverra" tête Set-Cookie "pour session-id dans HTTP-réponse ainsi que session-id joint en annexe à URL (mais vous devez utiliser response.encodeURL(session_info) pour url rewriting).

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    PrintWriter pw=resp.getWriter(); 
    HttpSession session=req.getSession(); 
    pw.println("<html><body>"); 
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>"); 
    pw.println("</body></html>"); 

}