web-dev-qa-db-fra.com

SessionTimeout: web.xml vs session.maxInactiveInterval ()

J'essaie de temporiser un HttpSession en Java. Mon conteneur est WebLogic.

Actuellement, notre délai de session est défini dans le fichier web.xml, comme ceci

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

Maintenant, on me dit que cela mettra fin à la session (ou est-ce que ce sont toutes des sessions?) À la 15e minute d'utilisation, quelle que soit leur activité.

Je me demande si cette approche est la bonne ou devrais-je fixer par programmation le délai d'inactivité en

session.setMaxInactiveInterval(15 * 60); //15 minutes

Je ne veux pas abandonner toutes les sessions à 15 minutes, mais uniquement celles qui sont inactives depuis 15 minutes.

Ces méthodes sont-elles équivalentes? Devrais-je privilégier le web.xml config?

58
Tom

Maintenant, on me dit que cela mettra fin à la session (ou est-ce que ce sont toutes des sessions?) À la 15e minute d'utilisation, quelle que soit leur activité.

Ceci est faux . Il va simplement tuer la session lorsque le client associé (navigateur Web) n'a pas accédé au site Web pendant plus de 15 minutes. L’activité compte certainement, exactement comme vous l’espériez au départ, en tentant de résoudre ce problème.

Le HttpSession#setMaxInactiveInterval() ne change pas grand chose ici d'ailleurs. Il fait exactement la même chose que <session-timeout> dans web.xml, à la seule différence que vous pouvez le modifier/le définir par programme pendant l'exécution. Le changement par la voie n'affecte que l'instance de session en cours, pas globalement (sinon, il s'agirait d'une méthode static.).


Pour jouer et expérimenter ceci vous-même, essayez de définir <session-timeout> à 1 minute et créez un HttpSessionListener comme suit:

@WebListener
public class HttpSessionChecker implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        System.out.printf("Session ID %s created at %s%n", event.getSession().getId(), new Date());
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.printf("Session ID %s destroyed at %s%n", event.getSession().getId(), new Date());
    }

}

(si vous n'êtes pas encore sur Servlet 3.0 et ne pouvez donc pas utiliser @WebListener, puis enregistrez-vous dans web.xml comme suit):

<listener>
    <listener-class>com.example.HttpSessionChecker</listener-class>
</listener>

Notez que le servletcontainer ne détruira pas immédiatement les sessions après exactement la valeur du délai d'attente. C'est un travail en arrière-plan qui s'exécute à certains intervalles (par exemple, 5 à 15 minutes, en fonction de la charge et du fabricant/type du servlet). Alors ne soyez pas surpris si vous ne voyez pas la ligne destroyed dans la console immédiatement après exactement une minute d'inactivité. Toutefois, lorsque vous déclenchez une requête HTTP sur une session dont le délai d’attente a expiré mais n’a pas encore été détruit, celle-ci sera immédiatement détruite.

Voir également:

117
BalusC

Maintenant, on me dit que cela mettra fin à la session (ou est-ce que ce sont toutes des sessions?) À la 15e minute d'utilisation, quelle que soit leur activité.

Non ce n'est pas vrai. Le session-timeout configure un délai d'expiration par session en cas d'inactivité.

Ces méthodes sont-elles équivalentes? Devrais-je privilégier la configuration web.xml?

Le paramètre dans le fichier web.xml est global, il s’applique à toutes les sessions d’un contexte donné. Par programmation, vous pouvez changer cela pour une session particulière.

12
Pascal Thivent