web-dev-qa-db-fra.com

Pourquoi la session n'est pas nulle après session.invalidate () dans JAVA?

Je fais face à un problème très étrange lors du développement de l'application WEB JavaEE.

Même après avoir invalidé le HttpSession en utilisant session.invalidate();, je ne reçois pas la session null. Il y a un cas où j'ai une instruction en cours d'exécution comme ci-dessous après avoir invalidé la session.

if (null != session && null != session.getAttribute("loginToken")){
   //do something
}

Je n'obtiens pas de session nulle ici, donc la deuxième condition essaiera de s'exécuter. Et donc la session n'est pas nulle, donc je reçois IllegalStateException - session is already invalidated. Mais pourquoi la session n'est pas nulle après l'avoir invalidée ?? :(

9
Vishal Zanzrukia

L'appel de session.invalidate() supprime la session du registre. L'appel de getSession(false) par la suite retournera null (notez que getSession() ou getSession(true) créera une nouvelle session dans ce cas). L'appel de invalidate() supprimera également tous les attributs de session liés à la session. Cependant, si votre code contient toujours des références à la session ou à l'un de ses attributs, ceux-ci seront toujours accessibles:

    // create session if none exists (default) and obtain reference
    HttpSession session = request.getSession();

    // add a session attribute
    session.setAttribute("lollypop", "it's my party");

    // obtain reference to session attribute 
    Object lollypop = session.getAttribute("lollypop");

    // print session ID and attribute
    System.out.println(session.getId());
    System.out.println(lollypop);

    session.invalidate();

    // session invalidated but reference to it still exists
    if (session == null) {            
        System.out.println("This will never happen!");
    }

    // print ID from invalidated session and previously obtained attribute (will be same as before)
    System.out.println(session.getId());
    System.out.println(lollypop);

    // print 'null' (create=false makes sure no new session is created)
    System.out.println(request.getSession(false));

Exemple de sortie:

1k47acjdelzeinpcbtczf2o9t
it's my party
1k47acjdelzeinpcbtczf2o9t
it's my party
null

Jusqu'ici pour l'explication. Pour résoudre votre problème, vous devez:

HttpSession existingSession = request.getSession(false);
if (existingSession != null && existingSession.getAttribute("loginToken") != null){
   //do something
}
13
Adriaan Koster

La méthode invalidate effectue les opérations suivantes (depuis API ):

Invalidates this session then unbinds any objects bound to it.

Il ne dit rien sur l'objet HttpSession- lui-même, mais invalide les variables de la session. Si vous appelez une méthode d'une classe, il est impossible que l'objet soit null après cet appel de méthode. Si votre session doit être nulle par la suite, la méthode doit inclure une ligne qui ressemble à quelque chose comme: this = null; ce qui ne serait pas possible. La levée d'une exception pour une session invalidée est la façon préférée de le faire.

4
Pphoenix

Essayez de passer false comme paramètre à getSession (booléen). Cela rendra une session si elle existe ou bien elle retournera null.

HttpSession session = request.getSession(false);
if(session==null || !request.isRequestedSessionIdValid() )
{
    //comes here when session is invalid.

}
1
Shivam Bansal