Ako oznámiť objektu, že relácia je neplatná alebo skončila?
sobes.tech AI
Odpoveď od AI
Na oznámenie objektu o neplatnosti alebo ukončení HTTP relácie v Java webových aplikáciách sa používajú poslucháči relácií (Session Listeners), definovaní špecifikáciou API servleta.
Triedy implementujúce rozhranie javax.servlet.http.HttpSessionListener dostávajú oznámenia o vytvorení a zničení relácií.
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 pri vytvorení relácie
HttpSession session = se.getSession();
System.out.println("Vytvorená relácia: " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Logika pri zničení relácie
HttpSession session = se.getSession();
System.out.println("Relácia zničená: " + session.getId());
// Tu môžete získať atribúty relácie a oznámiť objekty
MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");
if (myObject != null) {
myObject.notifySessionInvalidated(); // Volanie metódy na objekte
}
}
}
Na použitie poslucháča je potrebné ho zaregistrovať v súbore web.xml alebo pomocou anotácie (@WebListener):
Registrácia v web.xml:
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>
Registrácia pomocou @WebListener (od Servlet 3.0):
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// ... implementácia metód sessionCreated a sessionDestroyed
}
V metóde sessionDestroyed môžete získať prístup k objektom uloženým v relácii (atribútom) a oznámiť ich o ukončení relácie volaním špecifickej metódy na týchto objektoch, ak boli navrhnuté na spracovanie takýchto oznámení.
Ak objekt sám musí vedieť, kedy jeho relácia skončila, môže implementovať rozhranie javax.servlet.http.HttpSessionBindingListener. Objekty tohto typu dostávajú oznámenia, keď sú pridávané alebo odstraňované z relácie.
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MySessionBoundObject implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Objekt bol pridaný do relácie
System.out.println("Objekt pripojený k relácii: " + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Objekt bol odstránený z relácie alebo relácia bola zničená
System.out.println("Objekt odpojený od relácie: " + event.getSession().getId());
// Tu logika oznámenia, keď je objekt odstránený z relácie
notifySessionInvalidated(); // napríklad volanie vnútorného metódy
}
public void notifySessionInvalidated() {
System.out.println("MySessionBoundObject oznámený o ukončení relácie.");
// Vaša logika spracovania ukončenia relácie pre tento objekt
}
}
Keď je objekt MySessionBoundObject pridaný do relácie (session.setAttribute("myObjectKey", myObject)), volá sa valueBound. Keď je relácia zničená alebo atribút odstránený (session.removeAttribute("myObjectKey")), volá sa valueUnbound. Týmto spôsobom môže valueUnbound slúžiť ako oznámenie pre samotný objekt o ukončení jeho spojenej relácie.