terça-feira, 2 de agosto de 2011

Servlet Listeners - Listeners de Sessão - Parte 1

Olá Javeiros! Continuando a nossa sequência de posts sobre listeners (aqui tá o primeiro e aqui o segundo) hoje vamos começar a falar sobres os listeners de eventos de sessão. Vamos dividir o assunto em duas partes pois nós temos 4 interfaces para os listeners de sessão.

Antes de mais nada é importante que você saiba o que é uma sessão. Como o foco do post não é esse, não espere nenhum compêndio sobre o assunto aqui, quero apenas lembrar o conceito para aqueles que já viram algo sobre isso. Você nunca estudou o que é uma sessão http? Então é melhor você clicar aqui e dar uma estudada primeiro.

O protocolo HTTP é considerado um protocolo stateless, isso significa que cada requisição que é feita ao servidor é sempre uma novidade. Lembra do filme "Como se fosse a primeira vez"? Pois é, depois que o servidor recebe a requisição e envia a resposta ele jamais lembrará o que tinha nessa requisição. Bom, mas isso é porcaria não? É, realmente seria se não fosse o conceito de sessão http. Uma sessão http nada mais é do que a identificação das requisições de um usuário, como o protocolo http não armazena o estado das requisições, os  clientes enviam algo nela para que servidor saiba que aquela requisição foi feita pelo usuário A e não pelo B. Essa informação é o session ID.

Existem basicamente duas maneiras de implementar o controle de Sessão em uma aplicação Web Java:  através de Cookies ou da reescrita de URLs. A API de Servlets suporta as duas formas e o melhor é que o processo de controle é totalmente automático para o desenvolvedor. Cookies podem ser desabilitados pelo cliente, sendo assim, quando não for possível utilizar esta técnica, os Servlets poderão reescrever as URLs adicionando a elas o nosso Session ID.

A criação de uma Sessão pode ser feita a partir da chamada ao método getSession. Este método retornará a sessão que está associada à requisição atual, caso não exista, uma Sessão nova é criada. Você pode passar um booleano como parâmetro caso deseje decidir criar ou não uma nova sessão.

HttpSession session = request.getSession( ); 

Depois que um sessão é criada, toda requisição feita entre cliente e servidor carregará o session ID. A partir daí precisamos definir o tempo de duração de uma sessão e quando destruí-la, já que não há como saber se o cliente não está mais 'ativo'.

Encerrando uma Sessão

Existem duas formas de encerrar uma sessão, através da definição de um tempo máximo de inatividade setMaxInactiveInterval ou através da chamada ao método invalidate, os dois métodos estão presentes na interface HttpSession. É possível também configurar o tempo máximo através de um parâmetro no arquivo web.xml da aplicação, conforme pode ser visto abaixo:

 <session-config>
   <session-timeout>30</session-timeout>
 </session-config>

Vale apenas ressaltar que o tempo definido através do método setMaxInactiveInterval é em segundos, enquanto no web.xml é em minutos.


HttpSessionListener


A API de Servlets permite que interceptemos o momento em que uma sessão é criada ou destruída. Para isso precisamos criar um Listener de Sessão através da implementação da interface javax.servlet.http.HttpSessionListener. Essa interface possui 2 métodos que serão chamados sempre que uma sessão for criada, sessionCreated, ou destruída, sessionDestroyed. Por último a classe precisa ser configurada no web.xml para que o container possa chamá-la. A API 3.0 de Servlets permite a utilização de annotations na classe Listener, eliminando a necessidade do mapeamento no web.xml.
A seguir temos um exemplo de uma classe que implementa HttpSessionListener utilizando anotações.




Caso você não esteja usando a nova versão de Servlets, você deve mapear o listener no arquivo web.xml da aplicação:

 <listener>
   <listener-class>30</listener-class>
 </listener>


No próximo artigo iremos falar sobre sobre os outros Listeners de Sessão (Activation, Binding e Attribute).
Até o próximo post!

0 comentários: