Recentemente, eu estava escrevendo um site de compra de livros. Ao testar a função de logout, clicando no navegador para retornar para atualizar o navegador, você descobrirá que o usuário que já havia registrado o login novamente.
Depois de pensar por um longo tempo, encontrei muitas soluções on -line, mas a maioria dos métodos dados on -line é usar o JS para fazer logon e proibir os usuários de clicar no navegador para retornar.
Embora esse método seja viável, ele realmente não resolve esse problema em segundo plano. Parece proteger contra cavalheiros, mas não vilões.
A seguir é o método que você implementou
princípio:
Após o login, clique no navegador para retornar para atualizar o navegador. De fato, o navegador reassa as informações do formulário original.
Log Out significa matar a sessão original
// Log Out Private void Logout (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {httpsession session = request.getSession (); request.setattribute ("sessionId", session.getId ()); session.Removeattribute ("Usuário"); session.Invalidate (); Response.sendRedirect (request.getContextPath () + "/index.jsp"); } Ao redirecionar para uma página JSP após o registro, a sessão gerada é diferente da sessão original (a sessão da página JSP é ativada por padrão)
Ou seja, após o log -out, clicar no navegador para retornar para atualizar a sessão é uma nova sessão. Nesta perspectiva, pense na solução.
Coloquei uma parte dos dados na sessão original. Eu posso obter esses dados pela primeira vez quando fiz login. Após o login, a sessão original se foi. Clique no navegador para retornar à atualização. Não há dados na nova sessão. O valor obtido é nulo
Combine os dados na sessão original com o novo valor da sessão. Um tem um valor e o outro é nulo. A correspondência definitivamente falhará. No momento, você pode fornecer um prompt de fácil usuário e deixar o usuário fazer login novamente.
Então, como os dados na sessão original podem ser salvos após o registro (se a sessão original for cancelada, ela desaparecerá)? Considere adicionar um domínio oculto ao formulário e coloque os dados na sessão original no domínio oculto. Após o login, clique no navegador para retornar para atualizar. O navegador enviará automaticamente os dados na sessão original sem salvá -los manualmente (na verdade, a economia manual pode ter que ser colocada no contexto do aplicativo ServletContext, e eu nunca tentei)
Um pouco semelhante a uma solução para envios repetidos de formulários, mas os dados na sessão original não podem ser eliminados aqui, porque a mesma sessão não é a mesma sessão antes e após o logout.
Os detalhes são os seguintes: em login.jsp
<%String token = new Random (). Nextlong ()+""; session.setAttribute ("token", token);%> <formulário action = "$ {PageContext.Request.ContextPath}/servlet/ClientVlet? Operação = Login" Method = "Post"> <tath> <tr> type = "text" name = "name"> </td> </tr> <tr> <td align = "right"> senha: </td> <td> <input type = "sevenha" name = "senha"> </td> </tr> <tr> <td> <td> </td> <td> <input Typ = "submit") type = "hidden" name = "token" value = "$ {sessionscope.token}"> </mand> No servlet, dê um aviso amigável e redirecionar para a página de login
Session httpSession = request.getSession (); // Resolva o problema do login repetido do navegador após o registro // Dê um campo de entrada oculto e obtenha o valor do domínio oculto no fundo // refresque o navegador após o log -out gerar uma nova sessão, para que a sessão de sessão) seja falsa stringtken stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn stringtyn (shiddenToken) (session) stringtken stringtken; String hiddentoken = request.getParameter ("token"); if (! hiddentoken.equals (sessionToken)) {request.setAttribute ("mensagem", "você foi registrado, faça o login novamente e volte para a página de login após 2 segundos <meta http-equiv = 'refresch' content = 2; url =" + request.getContextPath () + "/client/glient/ogin/clients ' request.getRequestDispatcher ("/client/message.jsp"). Forward (solicitação, resposta); retornar; } teste:
Conecte-se
Após o login, clique no navegador para retornar à atualização. O navegador solicitará se deve reenviar os dados.
Clique para reenviar
Isso resolve o problema de clicar no navegador para retornar para atualizar o usuário e fazer login novamente após o login.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.