Sobes.tech
Middle

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.