Sobes.tech
Middle

Чӣ гуна огоҳ кардан дар объект, ки сессия нодуруст ё тамом шудааст?

sobes.tech AI

Ҷавоб аз AI

Барои огоҳ кардани объект дар бораи нодида гирифтани ё анҷоми сессияи HTTP дар барномаҳои веб Java, слушательҳои сессия (Session Listeners) истифода мешаванд, ки дар спецификацияи API сервлет муайян шудаанд.

Классҳое, ки интерфейси javax.servlet.http.HttpSessionListener-ро иҷро мекунанд, огоҳинома дар бораи эҷод ва нобуд кардани сессияҳоро мегиранд.

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) {  
        // Логика дар вақти эҷоди сессия  
        HttpSession session = se.getSession();  
        System.out.println("Сессия эҷод шуд: " + session.getId());  
    }  

    @Override  
    public void sessionDestroyed(HttpSessionEvent se) {  
        // Логика дар вақти нобуд кардани сессия  
        HttpSession session = se.getSession();  
        System.out.println("Сессия нобуд шуд: " + session.getId());  

        // Ин ҷо метавонед хосиятҳои сессияро гиред ва объектҳоро огоҳ кунед  
        MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");  
        if (myObject != null) {  
            myObject.notifySessionInvalidated(); // Даъвати усули дар объект  
        }  
    }  
}  

Барои истифодаи слушатель, бояд онро дар дескриптории паҳнкунӣ (web.xml) сабт кунед ё бо истифода аз аннотатсия (@WebListener):

Дар web.xml:

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

Бо истифода аз @WebListener (аз Servlet 3.0 ба баъд):

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

@WebListener  
public class MySessionListener implements HttpSessionListener {  
    // ... иҷрои методҳои sessionCreated ва sessionDestroyed
}

Дар дохили методи sessionDestroyed, шумо метавонед ба объектҳое, ки дар сессия нигоҳ дошта шудаанд (атрибутҳо), дастрасӣ пайдо кунед ва онҳоро огоҳ кунед, ки сессия тамом шуд, бо даъвати методи махсус дар ин объектҳо, агар онҳо барои кор бо чунин огоҳиномаҳо тарҳрезӣ шудаанд.

Агар объект бояд донад, ки кай сессияи ӯ тамом мешавад, метавонад интерфейси javax.servlet.http.HttpSessionBindingListener-ро иҷро кунад. Объектҳои ин навъ огоҳинома мегиранд, вақте ки онҳо ба сессия илова ё аз он хориҷ мешаванд.

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

public class MySessionBoundObject implements HttpSessionBindingListener {  

    @Override  
    public void valueBound(HttpSessionBindingEvent event) {  
        // Объект ба сессия илова шуд  
        System.out.println("Объект ба сессия пайваст шуд: " + event.getSession().getId());  
    }  

    @Override  
    public void valueUnbound(HttpSessionBindingEvent event) {  
        // Объект аз сессия хориҷ ё сессия нобуд шуд  
        System.out.println("Объект аз сессия хориҷ шуд: " + event.getSession().getId());  

        // Ин ҷо логика огоҳинома дар бораи хориҷ шудан аз сессия  
        notifySessionInvalidated(); // Масалан, даъвати методи дарунӣ  
    }  

    public void notifySessionInvalidated() {  
        System.out.println("MySessionBoundObject огоҳ карда шуд дар бораи нобудии сессия.");  
        // Логикаи коркарди анҷоми сессия барои ин объект  
    }  
}  

Вақте ки объект MySessionBoundObject ба сессия илова мешавад (session.setAttribute("myObjectKey", myObject)), valueBound даъват мешавад. Вақте ки сессия нобуд мешавад ё атрибут хориҷ мешавад (session.removeAttribute("myObjectKey")), valueUnbound даъват мешавад. Инчунин, valueUnbound метавонад ҳамчун огоҳинома барои худи объект хизмат кунад дар бораи анҷоми сессияи алоқаманд.