Sobes.tech
Middle

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.