Sobes.tech
Middle

Jak upozornit objekt, že relace je neplatná nebo skončila?

sobes.tech AI

Odpověď od AI

Pro oznámení objektu o neplatnosti nebo ukončení HTTP relace v Java webových aplikacích se používají posluchače relací (Session Listeners), definovaní specifikací API servlet.

Třídy implementující rozhraní javax.servlet.http.HttpSessionListener dostávají oznámení o vytvoření a zničení relací.

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 při vytvoření relace  
        HttpSession session = se.getSession();  
        System.out.println("Relace vytvořena: " + session.getId());  
    }  

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Logika při zničení relace  
        HttpSession session = se.getSession();  
        System.out.println("Relace zničena: " + session.getId());  

        // Zde můžete získat atributy relace a oznámit objekty  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Volání metody na vašem objektu  
        }  
    }  
}  

Pro použití posluchače je třeba jej zaregistrovat v souboru web.xml nebo pomocí anotace (@WebListener):

Registrace v web.xml:

<web-app ...>  
    <listener>  
        <listener-class>com.example.MySessionListener</listener-class>  
    </listener>  
</web-app>  

Registrace pomocí @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 {  
    // ... implementace metod sessionCreated a sessionDestroyed
}

V metodě sessionDestroyed můžete získat přístup k objektům uloženým v relaci (atributům) a oznámit jejich ukončení voláním specifické metody na těchto objektech, pokud jsou navrženy tak, aby takové oznámení zpracovávaly.

Pokud objekt sám musí vědět, kdy jeho relace skončila, může implementovat rozhraní javax.servlet.http.HttpSessionBindingListener. Objekty tohoto typu dostávají oznámení, když jsou přidány nebo odstraněny z relace.

import javax.servlet.http.HttpSessionBindingEvent;  
import javax.servlet.http.HttpSessionBindingListener;  

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Objekt byl přidán do relace  
        System.out.println("Objekt připojen k relaci: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Objekt byl odebrán z relace nebo relace byla zničena  
        System.out.println("Objekt odpojen od relace: " + event.getSession().getId());  

        // Zde logika oznámení, když je objekt odebrán z relace  
        notifySessionInvalidated(); // například volání vnitřní metody  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject oznámen o ukončení relace.");  
        // Vaše logika zpracování ukončení relace pro tento objekt  
    }  
}  

Když je objekt MySessionBoundObject přidán do relace (session.setAttribute("myObjectKey", myObject)), je volána metoda valueBound. Když je relace zničena nebo je atribut odstraněn (session.removeAttribute("myObjectKey")), je volána metoda valueUnbound. Tím může valueUnbound sloužit jako oznámení pro objekt o ukončení jeho spojení s relací.