Sobes.tech
Middle

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.