De ce sesiunea nu este nulă după session.invalidate() în JAVA? (Programare, Java, Sesiune, Invalidare)

Vishal Zanzrukia a intrebat.

Mă confrunt cu o problemă foarte ciudată în timp ce dezvolt o aplicație WEB JavaEE.

Chiar și după ce am invalidat HttpSession utilizând session.invalidate();, nu obțin sesiunea null. Există un caz în care am o instrucțiune în execuție ca mai jos, după invalidarea sesiunii.

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

Aici nu obțin sesiune nulă, astfel încât a doua condiție va încerca să se execute. Și, prin urmare, sesiunea nu este nulă, așa că obțin IllegalStateExceptionsession is already invalidated. Dar de ce sesiunea nu este nulă după ce a fost invalidată? 🙁

Comentarii

  • De ce ar fi null? Este pur și simplu invalidă. –  > Por Boris Păianjenul.
  • void invalidate() Invalidează această sesiune, apoi dezactivează toate obiectele legate de ea. Aruncă: IllegalStateException – în cazul în care această metodă este apelată pe o sesiune deja invalidată documente java : docs.oracle.com/javaee/5/api/javax/servlet/http/… –  > Por LMK.
  • O variabilă nu este null dacă nu o setați la null, indiferent de metoda pe care o apelați asupra ei, aceasta nu poate să facă null. –  > Por Peter Lawrey.
3 răspunsuri
Adriaan Koster

Apelare session.invalidate() elimină sesiunea din registru. Apelare getSession(false) după aceea va returna null (rețineți că getSession() sau getSession(true) va crea o nouă sesiune în acest caz, a se vedea API HttpServletRequest). Apelarea invalidate() va elimina, de asemenea, toate atributele sesiunii legate de sesiune. Cu toate acestea, în cazul în care codul dvs. are încă referințe la sesiune sau la oricare dintre atributele sale, acestea vor fi încă accesibile:

    // 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));

Exemplu de ieșire:

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

Până aici pentru explicații. Pentru a rezolva problema dvs. ar trebui să faceți următoarele:

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

Comentarii

  • Eu folosesc request.getSession(false); și tot am aceeași problemă 🙁 –  > Por Vishal Zanzrukia.
  • Dacă apelați request.getSession().invalidate() și direct după aceea, în același fir request.getSession(false), ar trebui să returneze null. Dacă nu, vă rugăm să ne arătați codul exact și stacktrace/rezultatul pe care îl vedeți. –  > Por Adriaan Koster.
  • Folosesc și eu request.getSession(false); încă mai am aceeași problemă. ați găsit o soluție pentru asta? –  > Por Swati Thakare.
  • @SwatiThakare Dacă este încă concepția inițială greșită că variabila care indică sesiunea va deveni în mod magic nulă după apelarea session.invalidate(), vă sugerez să recitiți comentariile și răspunsurile de pe această pagină. Dacă este vorba de altceva, vă rugăm să postați o nouă întrebare. –  > Por Adriaan Koster.
Pphoenix

Metoda invalidate face următoarele (din API):

Invalidates this session then unbinds any objects bound to it.

Nu spune nimic despre HttpSession-obiect în sine, dar invalidează variabilele sesiunii. Dacă apelați o metodă a unei clase, este imposibil ca obiectul să fie null după apelarea acelei metode. Dacă sesiunea ar trebui să fie nulă după aceea, metoda trebuie să includă o linie care să arate ceva de genul this = null; ceea ce nu ar fi posibil. Aruncarea unei excepții pentru o sesiune invalidată este modalitatea preferată de a face acest lucru.

Comentarii

  • Acest lucru este un nonsens, nu puteți atribui nimic la this ! –  > Por Gyro Gearless.
  • Acum este mai bine, dar cred că este încă confuz să spui că este „foarte puțin probabil” ca o referință de obiect să devină null după o invocare a unei metode asupra sa – este imposibil în Java! –  > Por Gyro Gearless.
  • @GyroGearless L-am ratat, am recitit textul și totul ar trebui să fie coerent acum. Vă mulțumim pentru contribuția dumneavoastră! 🙂 –  > Por Pphoenix.
Shivam Bansal

Încercați să treceți false ca parametru la getSession(boolean) . Acest lucru va returna o sesiune dacă aceasta există sau va returna null.

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

}