Чӣ гуна огоҳ кардан дар объект, ки сессия нодуруст ё тамом шудааст?
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 метавонад ҳамчун огоҳинома барои худи объект хизмат кунад дар бораи анҷоми сессияи алоқаманд.