English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
최근 책 구매 웹사이트를 작성하면서 로그아웃 기능을 테스트할 때 브라우저를 돌아가 새로고침하면 이미 로그아웃한 사용자가 다시 로그인한 것처럼 보입니다.
많은 시간을 생각해보고, 인터넷에서도 많은 방법을 찾았지만, 인터넷에서 제공하는 방법은 대부분 로그아웃 후 브라우저를 돌아가 새로고침을 방지하는 js를 사용하는 것입니다.
이 방법은 가능하지만, 실제로는 백엔드에서 문제를 해결하는 것이 아니라, 양자간의 문제를 해결하는 것처럼 보입니다.
아래에서 제가 구현한 방법을 기록해 보겠습니다.
원리:
로그아웃 후 브라우저를 돌아가 새로고침하면 실제로는 브라우저가 원래 form 양식의 정보를 다시 전송하는 것입니다.
로그아웃은 원래 세션을 제거하는 것입니다.
// 로그아웃 private void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); request.setAttribute("sessionId", session.getId()); session.removeAttribute("user"); session.invalidate(); response.sendRedirect(request.getContextPath()) + "/index.jsp"); }
로그아웃 후jsp 페이지로 리디렉션할 때 생성된 세션과 원래 세션은 다릅니다. (jsp 페이지 세션은 기본적으로 활성화되어 있습니다.)
따라서 로그아웃 후 브라우저를 돌아가 새로고침한 세션은 새 세션입니다. 이 점에서 해결책을 생각해보세요.
원래 세션에 데이터를 넣었고, 첫 번째 로그인 시 이 데이터를 가져올 수 있었지만, 로그아웃 후 원래 세션이 사라졌습니다. 브라우저를 돌아가 다시 새로고침하면 새 세션에 데이터가 없어서 값은 null입니다.
将原来的session里的数据与新的session值进行匹配,一个有值,一个为null,肯定会匹配失败,这时可以给用户友好的提示,让用户重新登录即可。
那么原来session里的数据如何在注销后(注销了原来的session就没了)保存呢?考虑在表单里增加一个隐藏域,将原来的session里的数据放在该隐藏域中,这样注销后点击浏览器返回刷新,浏览器会自动把原来session里的数据提交一遍,无需自己手动保存(事实上手动保存可能得放在servletContext应用上下文中,没试过)
有点类似于解决表单重复提交的一种办法,但是这里不能把原来的session里数据干掉,因为注销前后不是同一个session
具体如下:在login.jsp里
<% String token=new Random().nextLong()+""; session.setAttribute("token", token); %> <form action="${pageContext.request.contextPath}/servlet/ClientServlet?operation=login" method="post"> <table style="width: 50%;"> <tr> <td align="right">姓名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td align="right">密码:</td> <td><input type="password" name="password"></td> </tr> <tr> <tr> <td></td> <td><input type="submit" value="登录"></td> </tr> </table> <input type="hidden" name="token" value="${sessionScope.token}"> </form>
在servlet中,给出友好提示并重定向到登录页面
HttpSession session = request.getSession(); //解决注销后后退刷新浏览器重复登录的问题 //给一个隐藏输入域,后台获取隐藏域的值 //注销后后退刷新浏览器会生成新的session,这样sessionToken获取为null //따라서 hiddenToken.equals(sessionToken)은 반드시 false입니다. String sessionToken = (String) session.getAttribute("token"); String hiddenToken = request.getParameter("token"); if (!hiddenToken.equals(sessionToken)) { request.setAttribute("message", "You have been logged out, please log in again,",2초 후 전환합니다<meta http-equiv='Refresh' content=2;url=" + request.getContextPath() + "/client/login.jsp>"); request.getRequestDispatcher("/client/message.jsp").forward( request, response); return; }
테스트:
로그인
로그아웃 후 브라우저로 돌아가서 새로고침하면, 브라우저는 데이터를 다시 전송할지 여부를 확인할 것입니다.
다시 전송하기 클릭
이렇게 해서 로그아웃 후 브라우저로 돌아가서 새로고침하고 다시 로그인하는 문제를 해결했습니다.
이것이 이 문서의 모든 내용입니다. 많은 도움이 되길 바라며, 다들 노래 튜토리얼에 많은 지지를 해 주시길 바랍니다.
고지사항: 이 문서의 내용은 인터넷에서 가져왔으며, 원 저자에게 속합니다. 내용은 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반 내용이 있음을 발견하면, notice#w 이메일로 메일을 보내 주시기 바랍니다.3codebox.com(메일을 보내면, #을 @으로 바꿔서 제보해 주시고, 관련 증거를 제공해 주시면, 일단 사실이 확인되면, 이 사이트는 즉시 위법 내용을 삭제할 것입니다.