Sobes.tech
Middle

Kaip pranešti objektui, kad sesija yra nebegaliojanti arba pasibaigusi?

sobes.tech AI

Atsakymas iš AI

Java žiniatinklio programose sesijos (Session Listeners) naudojami klausytojai, kad praneštų objektui apie HTTP sesijos galiojimo pabaigą arba užbaigimą, kurie yra apibrėžti servlet API specifikacijoje:

Klases, įgyvendinančios sąsają javax.servlet.http.HttpSessionListener, gauna pranešimus apie sesijos sukūrimą ir sunaikinimą:

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 sesijos sukūrimui  
        HttpSession session = se.getSession();  
        System.out.println("Session created: " + session.getId());  
    }  

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Logika sesijos sunaikinimui  
        HttpSession session = se.getSession();  
        System.out.println("Session destroyed: " + session.getId());  

        // Čia galima gauti sesijos atributus ir pranešti objektams  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Jūsų objekto metodas  
        }  
    }  
}  

Norint užregistruoti klausytoją, jį reikia registruoti deployment descriptor'e (web.xml) arba naudojant anotacijas (@WebListener):

Registracija web.xml:

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

Registracija naudojant @WebListener (nuo Servlet 3.0):

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

@WebListener  
public class MySessionListener implements HttpSessionListener {  
    // ... įgyvendinti sessionCreated ir sessionDestroyed metodus
}

sessionDestroyed metode galima pasiekti sesijoje saugomus objektus (atributus) ir pranešti jiems apie sesijos pabaigą, jei šie objektai yra tam pritaikyti:

Jei objektas pats turi žinoti, kada jo sesija pasibaigė, jis gali įgyvendinti javax.servlet.http.HttpSessionBindingListener sąsają. Tokie objektai gauna pranešimus, kai jie yra pridedami arba pašalinami iš sesijos:

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

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Objekto pridėjimas į sesiją  
        System.out.println("Object bound to session: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Objekto pašalinimas iš sesijos arba sesijos sunaikinimas  
        System.out.println("Object unbound from session: " + event.getSession().getId());  

        // Čia galima įgyvendinti pranešimo logiką  
        notifySessionInvalidated(); // Pvz., iškvietus vidinį metodą  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject notified of session invalidation.");  
        // Jūsų sesijos pabaigos apdorojimo logika  
    }  
}  

Kai MySessionBoundObject objektas yra pridedamas į sesiją (session.setAttribute("myObjectKey", myObject)), iškviečiama valueBound. Kai sesija yra sunaikinama arba objektas yra pašalinamas iš sesijos (session.removeAttribute("myObjectKey")), iškviečiama valueUnbound. Taip valueUnbound gali būti naudojamas kaip įspėjimas objektui apie jo susijusios sesijos pabaigą.