2010-04-24 3 views
5

J'applique une application web qui utilise des sessions. J'utilise GWT et le moteur d'application comme client/serveur, mais je ne pense pas qu'ils fassent quelque chose de vraiment différent de ce que je ferais avec PHP et Apache.Combien de temps gardez-vous les cookies de session?

Lorsqu'un utilisateur se connecte à mon application Web, J'utilise HttpSession pour démarrer une session pour eux. Je reçois l'identifiant de session comme ceci:

// From my login servlet: 
getThreadLocalRequest().getSession(false).getId(); 

Je reviens le sessionId au client, et ils le stocker dans un cookie. Le tutoriel j'utilise des jeux ce cookie à «expire dans deux semaines:

Cookie.write("sid", theSessionId, 1000 * 60 * 60 * 24 * 14); // two weeks 

Voici où je suis confus: si le cookie expire dans deux semaines, puis mon utilisateur longera en utilisant la webapp heureusement, seulement pour un jour naviguer sur mon site et afficher un écran de connexion. Quelles sont mes options? Puis-je simplement ne pas définir de délai d'expiration pour ce cookie? De cette façon, l'utilisateur devrait se déconnecter explicitement, sinon il pourrait simplement utiliser l'application pour toujours sans avoir à se reconnecter.

Ou est-il une meilleure façon de le faire? Je ne me souviens pas de sites comme Twitter m'ayant jamais demandé de me reconnecter. Il semble que je sois connecté en permanence. Est-ce qu'ils ne définissent aucune date d'expiration?

La webapp ne protège aucune sorte de données hautement sensibles, donc cela ne me dérange pas de laisser un cookie qui n'expire pas, mais il semble qu'il doit y avoir un meilleur moyen?

C'est le tutoriel, je fais référence:

http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

Merci

+1

En règle générale, un grand nombre d'applications Web que j'ai vu vous permettent de cocher pour "rester connecté", qui soit vous permet de rester connecté indéfiniment, ou Si décoché, déconnectez-vous après la fermeture du navigateur. – Corey

Répondre

3

Le HttpSession est dans les coulisses déjà soutenues par un cookie. Vérifiez la liste de cookies du navigateur pour celui avec le nom jsessionid. En outre, lors de l'obtention d'une instance, vous devez appeler getSession() sans le false, sinon vous risquez un NullPointerException lorsqu'il n'est pas encore créé et donc retournera null.

Lorsque vous faites une connexion, vous mettez généralement le User connecté dans la session.

User user = userDAO.find(username, password); 
if (user != null) { 
    session.setAttribute("user", user); 
} else { 
    // Handle error "Unknown username/password combo." 
} 

Vous pouvez laisser votre interception webapplication sur la User connecté simplement en vérifiant sa présence à la session. Par exemple dans un Filter que vous souhaitez utiliser pour bloquer les pages sécurisées.

if (session.getAttribute("user") == null) { 
    response.sendRedirect("login"); 
} else { 
    chain.doFilter(request, response); 
} 

Le HttpSession a dans la plupart webcontainers un délai par défaut de 30 minutes. En d'autres termes, il expirera 30 minutes après la dernière demande. Ceci est configureable en web.xml comme suit:

<session-config> 
    <session-timeout>10</session-timeout> 
</session-config> 

Lorsque le délai d'attente est en minutes (donc 10 minutes dans l'exemple ci-dessus).

Si vous souhaitez fournir une option (automatique) « Se souvenir de moi sur cet ordinateur », vous devez créer un autre cookie avec un autre identifiant .J'ai posté précédemment une réponse qui va dans le détail à ce sujet: Java - How do I keep a user logged into my site for months?

+0

Ok donc je n'ai pas vraiment besoin de faire quoi que ce soit côté client pour supporter ça alors? J'ai testé sur app-engine et fonctionne, mais la session n'est pas conservée après que je ferme le navigateur, même si je mets une durée de session-timeout explicite dans web.xml. Je suppose que cela n'a pas d'importance cependant parce que la deuxième partie «garder un utilisateur connecté à mon site pendant des mois» devrait le couvrir? Merci – user246114

+0

Lorsque vous fermez le navigateur Web, tous les cookies sans âge seront ignorés. Vous devez fournir votre propre cookie chaque fois que vous souhaitez le garder un peu plus longtemps. – BalusC

+1

Ok c'est logique - mais alors je suis confus quant à la façon dont vous pouvez faire une connexion automagique immédiate comme dans votre réponse à une autre question? Lorsque l'utilisateur redémarre son navigateur, jsessionid est purgé. Donc, au prochain redémarrage, le navigateur ira à www.monsite.com et * pas * voir qu'il a jsessionid. Par conséquent, le serveur servira la page comme si l'utilisateur n'était pas authentifié. Cela demandera au client de revenir sur le serveur maintenant pour lui dire que l'utilisateur est en fait authentifié. N'y at-il pas un moyen pour le navigateur d'envoyer mon propre cookie lors de la première présentation? Élaborera dans l'édition Q originale, merci! – user246114