Sobes.tech
Middle

Kuidas teavitada objekti, et sessioon on kehtetu või lõppenud?

sobes.tech AI

Vastus AI-lt

Java veebirakendustes kasutatakse sessiooni kuulajaid (Session Listeners), et teavitada objekti HTTP sessiooni kehtivuse lõppemisest või lõpetamisest, mis on määratletud servlet API spetsifikatsioonis:

Klasse, mis implementeerivad javax.servlet.http.HttpSessionListener liidest, saavad teateid sessiooni loomise ja hävitamise kohta:

import javax.servlet.http.HttpSessionEvent;  
import javax.servlet.http.HttpSessionListener;  
import javax.servlet.http.HttpSession;  

public class MySessionListener implements HttpSessionListener {  

    @Override  
    public void sessionCreated(HttpSessionEvent se) {  
        // Loogika sessiooni loomisel  
        HttpSession session = se.getSession();  
        System.out.println("Session created: " + session.getId());  
    }  

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Loogika sessiooni hävitamisel  
        HttpSession session = se.getSession();  
        System.out.println("Session destroyed: " + session.getId());  

        // Siin saab saada sessiooni atribuute ja teavitada objekte  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Teie objekti meetod  
        }  
    }  
}  

Kasutamiseks tuleb registreerida kuulaja deployment descriptor'is (web.xml) või annotatsioonide (@WebListener) abil:

Registreerimine web.xml-is:

<web-app ...>  
    <listener>  
        <listener-class>com.example.MySessionListener</listener-class>  
    </listener>  
</web-app>  

Registreerimine @WebListener-iga (alates Servlet 3.0):

import javax.servlet.annotation.WebListener;  
import javax.servlet.http.HttpSessionEvent;  
import javax.servlet.http.HttpSessionListener;  

@WebListener  
public class MySessionListener implements HttpSessionListener {  
    // ... meetodite sessionCreated ja sessionDestroyed implementeerimine
}

sessionDestroyed meetodis saab ligi pääseda sessioonis olevatele objektidele (atribuutidele) ning teavitada neid sessiooni lõpetamisest, kui need on selleks ette nähtud:

Kui objekt peab ise teadma, millal tema sessioon lõppes, võib ta implementeerida javax.servlet.http.HttpSessionBindingListener liidest. Sellised objektid saavad teateid, kui nad lisatakse või eemaldatakse sessioonist:

import javax.servlet.http.HttpSessionBindingEvent;  
import javax.servlet.http.HttpSessionBindingListener;  

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Objekt lisati sessiooni  
        System.out.println("Object bound to session: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Objekt eemaldati sessioonist või sessioon hävitati  
        System.out.println("Object unbound from session: " + event.getSession().getId());  

        // Siin saab teostada teavitamise loogikat  
        notifySessionInvalidated(); // Näiteks kutsuda sisemist meetodit  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject notified of session invalidation.");  
        // Teie loogika sessiooni lõpetamise töötlemiseks  
    }  
}  

Kui MySessionBoundObject objekt lisatakse sessiooni (session.setAttribute("myObjectKey", myObject)), kutsutakse valueBound. Kui sessioon hävitatakse või objekt eemaldatakse sessioonist (session.removeAttribute("myObjectKey")), kutsutakse valueUnbound. Seega võib valueUnbound toimida teavituse mehhanismina objekti jaoks tema seotud sessiooni lõpetamise kohta.