Sobes.tech
Middle

Kā paziņot objektam, ka sesija ir nederīga vai beigusies?

sobes.tech AI

Atbilde no AI

Java tīmekļa lietojumprogrammās sesijas klausītāji (Session Listeners) tiek izmantoti, lai paziņotu objektam par HTTP sesijas nederīgumu vai pabeigšanu, kas ir noteikts sērijas API specifikācijā:

Klases, kas realizē interfeisu javax.servlet.http.HttpSessionListener, saņem paziņojumus par sesijas izveidi un iznīcināšanu:

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

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Logika sesijas iznīcināšanai  
        HttpSession session = se.getSession();  
        System.out.println("Session destroyed: " + session.getId());  

        // Šeit var iegūt sesijas atribūtus un paziņot objektus  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Jūsu objekta metode  
        }  
    }  
}  

Lai reģistrētu klausītāju, to nepieciešams reģistrēt deployment descriptor (web.xml) vai ar anotācijām (@WebListener):

Reģistrācija web.xml:

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

Reģistrācija ar @WebListener (no Servlet 3.0):

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

@WebListener  
public class MySessionListener implements HttpSessionListener {  
    // ... īstenot sessionCreated un sessionDestroyed metodes
}

sessionDestroyed metodē ir iespējams piekļūt sesijā saglabātajiem objektiem (atribūtiem) un paziņot tiem par sesijas pabeigšanu, ja šie objekti ir tam paredzēti:

Ja objekts pats ir jāzina, kad tā sesija ir pabeigta, tas var īstenot javax.servlet.http.HttpSessionBindingListener interfeisu. Šādi objekti saņem paziņojumus, kad tie tiek pievienoti vai noņemti no sesijas:

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

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Objekts pievienots sesijai  
        System.out.println("Object bound to session: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Objekts noņemts no sesijas vai sesija ir iznīcināta  
        System.out.println("Object unbound from session: " + event.getSession().getId());  

        // Šeit var īstenot paziņojuma loģiku  
        notifySessionInvalidated(); // Piemēram, izsaucot iekšējo metodi  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject notified of session invalidation.");  
        // Jūsu sesijas pabeigšanas apstrādes loģika  
    }  
}  

Kad MySessionBoundObject objekts tiek pievienots sesijai (session.setAttribute("myObjectKey", myObject)), tiek izsaukts valueBound. Kad sesija tiek iznīcināta vai objekts tiek noņemts no sesijas (session.removeAttribute("myObjectKey")), tiek izsaukts valueUnbound. Tādējādi valueUnbound var kalpot kā paziņojums objektam par tā saistītās sesijas pabeigšanu.