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.