Kaip pranešti objektui, kad sesija yra nebegaliojanti arba pasibaigusi?
sobes.tech AI
Atsakymas iš AI
Java žiniatinklio programose sesijos (Session Listeners) naudojami klausytojai, kad praneštų objektui apie HTTP sesijos galiojimo pabaigą arba užbaigimą, kurie yra apibrėžti servlet API specifikacijoje:
Klases, įgyvendinančios sąsają javax.servlet.http.HttpSessionListener, gauna pranešimus apie sesijos sukūrimą ir sunaikinimą:
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) {
// Logika sesijos sukūrimui
HttpSession session = se.getSession();
System.out.println("Session created: " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Logika sesijos sunaikinimui
HttpSession session = se.getSession();
System.out.println("Session destroyed: " + session.getId());
// Čia galima gauti sesijos atributus ir pranešti objektams
MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");
if (myObject != null) {
myObject.notifySessionInvalidated(); // Jūsų objekto metodas
}
}
}
Norint užregistruoti klausytoją, jį reikia registruoti deployment descriptor'e (web.xml) arba naudojant anotacijas (@WebListener):
Registracija web.xml:
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>
Registracija naudojant @WebListener (nuo Servlet 3.0):
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// ... įgyvendinti sessionCreated ir sessionDestroyed metodus
}
sessionDestroyed metode galima pasiekti sesijoje saugomus objektus (atributus) ir pranešti jiems apie sesijos pabaigą, jei šie objektai yra tam pritaikyti:
Jei objektas pats turi žinoti, kada jo sesija pasibaigė, jis gali įgyvendinti javax.servlet.http.HttpSessionBindingListener sąsają. Tokie objektai gauna pranešimus, kai jie yra pridedami arba pašalinami iš sesijos:
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MySessionBoundObject implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Objekto pridėjimas į sesiją
System.out.println("Object bound to session: " + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Objekto pašalinimas iš sesijos arba sesijos sunaikinimas
System.out.println("Object unbound from session: " + event.getSession().getId());
// Čia galima įgyvendinti pranešimo logiką
notifySessionInvalidated(); // Pvz., iškvietus vidinį metodą
}
public void notifySessionInvalidated() {
System.out.println("MySessionBoundObject notified of session invalidation.");
// Jūsų sesijos pabaigos apdorojimo logika
}
}
Kai MySessionBoundObject objektas yra pridedamas į sesiją (session.setAttribute("myObjectKey", myObject)), iškviečiama valueBound. Kai sesija yra sunaikinama arba objektas yra pašalinamas iš sesijos (session.removeAttribute("myObjectKey")), iškviečiama valueUnbound. Taip valueUnbound gali būti naudojamas kaip įspėjimas objektui apie jo susijusios sesijos pabaigą.