Como notificar ao objeto que a sessão não é válida ou terminou?
sobes.tech IA
Resposta da IA
Para notificar um objeto sobre a invalidade ou término de uma sessão HTTP em aplicações web Java, utilizam-se ouvintes de sessões (Session Listeners), definidos pela especificação da API de servlets.
As classes que implementam a interface javax.servlet.http.HttpSessionListener recebem notificações sobre a criação e destruição de sessões.
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) {
// Lógica na criação da sessão
HttpSession session = se.getSession();
System.out.println("Sessão criada: " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// Lógica na destruição da sessão
HttpSession session = se.getSession();
System.out.println("Sessão destruída: " + session.getId());
// Aqui pode-se obter atributos da sessão e notificar objetos
MySessionObject myObject = (MySessionObject) session.getAttribute("myObjectKey");
if (myObject != null) {
myObject.notifySessionInvalidated(); // Chamada ao método no seu objeto
}
}
}
Para usar o ouvinte, é necessário registá-lo no descriptor de implantação (web.xml) ou por meio de anotações (@WebListener):
Registo no web.xml:
<web-app ...>
<listener>
<listener-class>com.example.MySessionListener</listener-class>
</listener>
</web-app>
Registo com @WebListener (a partir do Servlet 3.0):
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// ... implementação dos métodos sessionCreated e sessionDestroyed
}
Dentro do método sessionDestroyed, pode-se aceder aos objetos armazenados na sessão (atributos) e notificar sobre o término da sessão, chamando um método específico nesses objetos se eles forem projetados para lidar com essa notificação.
Se um objeto deve saber quando sua sessão termina, pode implementar a interface javax.servlet.http.HttpSessionBindingListener. Os objetos desse tipo recebem notificações quando são adicionados ou removidos da sessão.
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class MySessionBoundObject implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// Objeto adicionado à sessão
System.out.println("Objeto vinculado à sessão: " + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// Objeto removido da sessão ou sessão destruída
System.out.println("Objeto desvinculado da sessão: " + event.getSession().getId());
// Aqui lógica para notificar quando o objeto é removido da sessão
// (incluindo a destruição da sessão)
notifySessionInvalidated(); // Por exemplo, chamada a um método interno
}
public void notifySessionInvalidated() {
System.out.println("MySessionBoundObject notificado da invalidação da sessão.");
// Sua lógica de tratamento de finalização de sessão para este objeto
}
}
Quando o objeto MySessionBoundObject é adicionado à sessão (session.setAttribute("myObjectKey", myObject)), valueBound é chamado. Quando a sessão é destruída ou o objeto é removido da sessão (session.removeAttribute("myObjectKey")), valueUnbound é chamado. Assim, valueUnbound pode servir como notificação para o próprio objeto sobre o término de sua sessão associada.