English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

javaweb 사용자가 로그아웃 후 브라우저로 돌아가고 페이지를 새로 고침하여 다시 로그인하는 문제 해결 방법

최근 책 구매 웹사이트를 작성하면서 로그아웃 기능을 테스트할 때 브라우저를 돌아가 새로고침하면 이미 로그아웃한 사용자가 다시 로그인한 것처럼 보입니다. 

많은 시간을 생각해보고, 인터넷에서도 많은 방법을 찾았지만, 인터넷에서 제공하는 방법은 대부분 로그아웃 후 브라우저를 돌아가 새로고침을 방지하는 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(메일을 보내면, #을 @으로 바꿔서 제보해 주시고, 관련 증거를 제공해 주시면, 일단 사실이 확인되면, 이 사이트는 즉시 위법 내용을 삭제할 것입니다.

추천 합니다