Wie benachrichtigt man das Objekt, dass die Sitzung ungültig ist oder beendet wurde?
sobes.tech KI
Antwort von AI
Um Objekte über die Ungültigkeit oder Beendigung einer HTTP-Sitzung in Java-Webanwendungen zu benachrichtigen, werden Sitzungs-Listener (Session Listeners) verwendet, die in der Servlet-API-Spezifikation definiert sind.
Klassen, die das Interface javax.servlet.http.HttpSessionListener implementieren, erhalten Benachrichtigungen über die Erstellung und Zerstörung von Sitzungen.
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) {
// Logik bei Sitzungsbeginn
HttpSession session = se.getSession();
System.out.println("Sitzung erstellt: " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Logik bei Sitzungsende
HttpSession session = se.getSession();
System.out.println("Sitzung zerstört: " + session.getId());
// Hier können Sitzungsattribute abgerufen und Objekte benachrichtigt werden
MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");
if (myObject != null) {
myObject.notifySessionInvalidated(); // Methode auf Ihrem Objekt aufrufen
}
}
}
Um den Listener zu verwenden, muss er in der Deployment-Deskriptor (web.xml) oder mit Annotationen (@WebListener) registriert werden:
Registrierung in web.xml:
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>
Registrierung mit @WebListener (ab Servlet 3.0):
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// ... Implementierung der Methoden sessionCreated und sessionDestroyed
}
Innerhalb der Methode sessionDestroyed kann auf die in der Sitzung gespeicherten Objekte (Attribute) zugegriffen und diese über das Ende der Sitzung benachrichtigt werden, indem eine spezifische Methode auf diesen Objekten aufgerufen wird, falls sie dafür ausgelegt sind.
Wenn ein Objekt wissen soll, wann seine Sitzung beendet ist, kann es das Interface javax.servlet.http.HttpSessionBindingListener implementieren. Objekte dieses Typs erhalten Benachrichtigungen, wenn sie zur Sitzung hinzugefügt oder daraus entfernt werden.
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MySessionBoundObject implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Objekt wurde zur Sitzung hinzugefügt
System.out.println("Objekt an Sitzung gebunden: " + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Objekt wurde aus der Sitzung entfernt oder Sitzung wurde beendet
System.out.println("Objekt von Sitzung getrennt: " + event.getSession().getId());
// Hier Logik, um die Benachrichtigung bei Sitzungsende zu verarbeiten
notifySessionInvalidated(); // Beispielhafter Methodenaufruf
}
public void notifySessionInvalidated() {
System.out.println("MySessionBoundObject über Sitzungsbeendigung benachrichtigt.");
// Ihre Logik zur Behandlung des Sitzungsendes für dieses Objekt
}
}
Wenn das Objekt MySessionBoundObject zur Sitzung hinzugefügt wird (session.setAttribute("myObjectKey", myObject)), wird valueBound aufgerufen. Wenn die Sitzung zerstört wird oder das Objekt entfernt wird (session.removeAttribute("myObjectKey")), wird valueUnbound aufgerufen. Damit kann valueUnbound als Benachrichtigung für das Objekt selbst dienen, dass seine zugehörige Sitzung beendet wurde.