Problema na implementação de login/logout usando jsp e servlet

8 respostas
W

Ola amigos. Tô tentando fazer um tela de login/logout com jsp e servlet para uma agenda de contatos. Quando eu logo consigo acessar meus contatos normalmente e quando faço logout sou direcionado para pagina de login, até tudo certo. o problema é se eu voltar, usando a seta do browser, consigo ver minha lista de contatos de novo, por exemplo. ou seja todas as paginas da agenda navegadas antes continuam lá, mesmo depois de invalidar a sessão. Tô tentando fazer com que após invalidar a sessão ser direcionado para tela de login e não voltar para as paginas anteriores. desde já agradeço a atenção de todos.

Código da página de login

package br.com.caelum.mvc.logica;

import java.sql.Connection;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.caelum.agenda.dao.UsuarioDAO;
import br.com.caelum.agenda.modelo.Usuario;

public class LoginLogic implements Logica{
   @Override  
   public void executa(HttpServletRequest request, HttpServletResponse response)  
        throws Exception {  
	   String resultadoJSP = "/login.jsp";       
      
		 	
   	  Connection connection = (Connection) request.getAttribute("conexao");
	  UsuarioDAO dao = new UsuarioDAO(connection);  
	          
	  Usuario usuario =  dao.pesqUsuarioByUsusarioSenha(request.getParameter("login"),
	    		request.getParameter("senha"));
	        
	  HttpSession sessao = request.getSession();
	  

	  if(usuario != null){ 
		  
		  sessao.setAttribute("login", usuario.getLogin());
		  sessao.setAttribute("id", usuario.getId());
		  
		  String usuarioAutenticado = (String) sessao.getAttribute("login");
		  Long idUsuarioAutenticado = (Long) sessao.getAttribute("id");
		  
		  if (usuarioAutenticado == null || idUsuarioAutenticado == null) {
			  resultadoJSP = "login.jsp";
			  
		  }
		  resultadoJSP = "/bemvindo.jsp";
	    
      }else{
    	  resultadoJSP = "/erro_login.jsp";
      }
	   
	  RequestDispatcher rd = request.getRequestDispatcher(resultadoJSP);  
	  rd.forward(request, response);   
   }

  
	  
}

Código de logout

package br.com.caelum.mvc.logica;


import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class LogoutLogic implements Logica{
   @Override  
   public void executa(HttpServletRequest request, HttpServletResponse response)  
        throws Exception {  
	  
		request.getSession().invalidate();	
	   
		RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");  
		rd.forward(request, response); 
   }  
	  
}

8 Respostas

M

em vez de usar dispacher usa rendirect.

nao sei se vai resolver, mas é um chute! hehehe

M

isso SEMPRE vai acontecer, independente de qualquer coisa, pois o browser le um HTML, que é o que é rendereizado pra ele, e esse html é guardado no CACHE.

O importante é que, dando um f5 quando volta no browser após invalidar ele não recarregue os contatos e sim saia…

L
utilize javascript abaixo na pagina mestre
window.onbeforeunload = function() {                           
        jQuery('#formLogoff').submit();   
        alert("Você saiu do chat.");           
        //sleep(5000);   
    }         
  
  
lt;form action="<%=request.getContextPath()%>/finalizarChat.jsp" id="formLogoff">   
<input type="hidden" name="salaNome" value="<%=salaNome%>">   
lt;/form>
W

Obrigado por responderem, mas não é um chat é a agenda de contatos da apostila fj21 da Caelum.
E eu tô evitando scriptlets. quero usar EL (expression language). valeu.

F

estou com o mesmo problema, vc conseguiu resolver?

if (sim)

Coloca o código aí com a solução

else

vou adotar o tópico, resolver (com a ajuda da comunidade é claro) e postar a solução

W

Não amigo, não consegui resolver. Tive um problema no computador e perdi o código. Vou ter que refazê-lo.

F

cara... não concluí a implementação mas já sei como resolver seu problema

vc deve usar um filter que vai verificar a cada requisição se o usuário está logado ou não, exemplo:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;



public class TreinamentoFilter implements Filter{	
	/*
	 *  O método destroy é chamado para avisar o filtro que ele está sendo desativado,
	 *  e possa liberar eventuais recursos alocados. 
	 * 		@see javax.servlet.Filter#destroy()
	 */
	public void destroy() {
		
	}
	
	/*
	 * O método doFilter é onde é feito todo o processamento do filtro	 
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {		

		HttpServletResponse res = (HttpServletResponse) response;
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		
		System.out.println("- "+session.getAttribute("logado"));		

		boolean usuarioLogado;
		if (session.getAttribute("logado") != null) {
			System.out.println("Logado "+session.getAttribute("logado"));
			usuarioLogado = true;
		}else{
			System.out.println("Não logado");
			usuarioLogado = false;			
		}

		if(usuarioLogado){
			//**essa parte é executada antes do request chegar ao Servlet		
			chain.doFilter(request, response);		
			//**essa parte é executada depois que o response já foi gerado pelo Servlet	
		}else{
			res.sendRedirect("/treinamento/treinamento/geral/login.jsp");
		}

	}  	

	/*
	 * O método init é chamado uma vez antes do filtro entrar em operação pela primeira vez. 
	 * Como parâmetro é passado um FilterConfig de onde se pode obter o nome do filtro
	 */
	public void init(FilterConfig fConfig) throws ServletException {
	
	}


}

esse filter acima não está concluído mas é por aí. Caso o cara não esteja logado ele será redirecionado [res.sendRedirect("/treinamento/treinamento/geral/login.jsp");]

esse filter deve ser configurado no web.xml de sua aplicação, + ou - assim:

<filter>
		<filter-name>TreinamentoFilter</filter-name>
		<filter-class>br.treinamento.web.filtro.TreinamentoFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>TreinamentoFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

desculpe se não está muito claro mas serve de base para uma pesquisa na web, abraço.

W

Valeu amigo, assim que retomar esse projeto, usarei suas dicas e darei noticías.

Criado 26 de março de 2012
Ultima resposta 19 de dez. de 2012
Respostas 8
Participantes 5