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.