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

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); 
   }  
	  
}

em vez de usar dispacher usa rendirect.

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

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…

utilize javascript abaixo na pagina mestre

[code]window.onbeforeunload = function() {
jQuery(’#formLogoff’).submit();
alert(“Você saiu do chat.”);
//sleep(5000);
}

lt;form action="<%=request.getContextPath()%>/finalizarChat.jsp" id=“formLogoff”>

lt;/form>
[/code]

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.

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

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

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:

[code]
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 {

}

}[/code]

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.

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