Sobes.tech
Middle

Hogyan értesítsük a tárgyat, hogy a munkamenet érvénytelen vagy véget ért?

sobes.tech MI

Válasz az MI-től

Az objektum érvénytelenítéséről vagy a HTTP-munkamenet befejezéséről való értesítéshez Java webalkalmazásokban munkamenetfigyelőket (Session Listeners) használnak, amelyeket a servlet API specifikációja határoz meg.

Az javax.servlet.http.HttpSessionListener interfészt megvalósító osztályok értesítést kapnak a munkamenetek létrehozásáról és megsemmisítéséről.

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 a munkamenet létrehozásakor  
        HttpSession session = se.getSession();  
        System.out.println("Munkamenet létrehozva: " + session.getId());  
    }  

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Logika a munkamenet megsemmisítésekor  
        HttpSession session = se.getSession();  
        System.out.println("Munkamenet megsemmisítve: " + session.getId());  

        // Itt hozzáférhet a munkamenet attribútumaihoz és értesítheti a tárgyakat  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Metódus hívása az objektumon  
        }  
    }  
}  

A figyelő regisztrálásához a web.xml-ben vagy az @WebListener annotációval kell megtenni:

Web.xml-ben:

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

Az @WebListener használatával (a Servlet 3.0-tól kezdve):

import javax.servlet.annotation.WebListener;  
import javax.servlet.http.HttpSessionEvent;  
import javax.servlet.http.HttpSessionListener;  

@WebListener  
public class MySessionListener implements HttpSessionListener {  
    // ... a sessionCreated és sessionDestroyed metódusok implementációja
}

A sessionDestroyed metódusban hozzáférhet a munkamenetben tárolt objektumokhoz (attribútumokhoz), és értesítheti őket a munkamenet befejezéséről, meghívva egy speciális metódust ezeken az objektumokon, ha azok úgy vannak tervezve, hogy kezeljék az ilyen értesítéseket.

Ha az objektumnak magának kell tudnia, mikor ért véget a munkamenete, implementálhatja a javax.servlet.http.HttpSessionBindingListener interfészt. Ezek az objektumok értesítést kapnak, amikor hozzáadódnak vagy eltávolításra kerülnek a munkamenetből.

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

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Az objektum hozzáadva a munkamenethez  
        System.out.println("Objektum kötve a munkamenethez: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Az objektum eltávolítva a munkamenetből vagy a munkamenet megsemmisítve  
        System.out.println("Objektum eloldva a munkamenetről: " + event.getSession().getId());  

        // Itt logika az értesítéshez, amikor az objektum el van távolítva a munkamenetből  
        notifySessionInvalidated(); // Például belső metódus hívása  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject értesítve a munkamenet megszűnéséről.");  
        // A munkamenet befejezésének feldolgozó logika  
    }  
}  

Amikor a MySessionBoundObject hozzáadódik a munkamenethez (session.setAttribute("myObjectKey", myObject)), meghívódik a valueBound. Amikor a munkamenet megsemmisül vagy az attribútum eltávolításra kerül (session.removeAttribute("myObjectKey")), meghívódik a valueUnbound. Így a valueUnbound szolgálhat értesítésként az objektum számára a kapcsolódó munkamenet befejezéséről.