Kako obavestiti objekat da je sesija nevažeća ili je završila?
sobes.tech АИ
Одговор од АИ
За обавештавање објекта о неважењу или завршетку 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 може послужити као обавештење за сам објекат о завршетку његове везане сесије.