Login Listener (auth-method = FORM) ? Existe algum listener no caso de sucesso do login?

4 respostas
pedroabs

Tem uma coisa que eu não entendo. O Java (vários frameworks) tem listeners prá tudo, inclusive a especificação Servlets e JSP tem vários listeners disponíveis, porém o sistema de autenticação com método FORM não possui nenhum listener para dizer que o login ocorreu com sucesso ou não.

<login-config>
	<auth-method>FORM</auth-method>
	<form-login-config>
		<form-login-page>/Login.jsp</form-login-page>
		<form-error-page>/LoginError.jsp</form-error-page>
	</form-login-config>
</login-config>

Gostaria muito de ter um listener para o evento de sucesso de login assim eu poderia carregar um objeto que representa um usuário na sessão do tomcat imediatamente após o sucesso do evento sem ter que ficar repetindo código que verifica se tal objeto já existe na sessão.

package com.motta.servlets.usuario;

import java.io.IOException;

......

public class SeusDados extends MyGenericServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// recupera sessão que já existe
		HttpSession session = request.getSession(false);
		Usuario usuario = (Usuario)session.getAttribute("usuario");
		
  
		if (usuario == null) {
			[b]UsuarioDAO usuarioDao = factory.createUsuarioDAO();
			String nome = request.getUserPrincipal().getName();
			usuario = usuarioDao.find(nome);
			session.setAttribute("usuario", usuario);[/b]
		}
		
		RequestDispatcher view = request.getRequestDispatcher("/usuario/SeusDados.jsp");
		view.forward(request, response);
	}
}

Será que isso é possível?

4 Respostas

FernandoFranzini

Na especificação JEE (web container) não existe tal listener…por enquanto não!
Este ponto, poderia ser a carga da 1 pagina depois da autenticação com sucesso.
Talvez usando algum framework proprietário tenha algo.

andreiribas

Você pode fazer sua classe Usuário implementar o listener SessionBindingListener.

Essa interface tem os métodos

valueBound e valueUnbound, que executam quando uma instância dessa classe foi adicionada ou removida da HttpSession.

Para mais info:

http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionBindingListener.html

FernandoFranzini

andreiribas:
Você pode fazer sua classe Usuário implementar o listener SessionBindingListener.
Essa interface tem os métodos
valueBound e valueUnbound, que executam quando uma instância dessa classe foi adicionada ou removida da HttpSession.
Para mais info:
http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionBindingListener.html

Muito bem lembrando André!

pedroabs

Caro sr. andreiribas

Acho que não é o caso de usar o SessionBindingListener pois o que gostaria de fazer é que quando o usuário insere as credenciais certas então temos a oportunidade de executar um código (escutado) pelo listener que permite que eu carregue um objeto Usuario na sessão.

Observando o Twitter, podemos ver que temos apenas um link na tela inicial que permite o login. Acho que vou partir para esta mesma abordagem: crio uma “porta de entrada” da aplicação e os links para páginas restritas só serão acessíveis quando o usujário já estiver logado, assim terei uma oportunidade de com um único servlet caregar o objeto Usuario na sessão.

Criado 15 de agosto de 2011
Ultima resposta 15 de ago. de 2011
Respostas 4
Participantes 3