最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javaweb用戶注銷后點(diǎn)擊瀏覽器返回刷新頁(yè)面重復(fù)登錄問題的解決方法

 更新時(shí)間:2021年07月04日 15:06:43   作者:pokid  
這篇文章主要為大家詳細(xì)介紹了javaweb用戶注銷后點(diǎn)擊瀏覽器返回刷新頁(yè)面重復(fù)登錄問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近在寫一個(gè)購(gòu)書網(wǎng)站,測(cè)試注銷功能時(shí)點(diǎn)擊瀏覽器返回刷新瀏覽器,會(huì)發(fā)現(xiàn)原本已經(jīng)注銷的用戶又重新登錄了

想了很久在網(wǎng)上也找了很多辦法,不過網(wǎng)上給出的辦法大多是用js實(shí)現(xiàn)注銷后禁止用戶點(diǎn)擊游覽器返回

這個(gè)辦法雖然可行,但并不是在后臺(tái)真正的解決這個(gè)問題,有一種防君子不防小人的感覺 

下面把自己實(shí)現(xiàn)的方法記錄下來(lái)

原理:

注銷后點(diǎn)擊瀏覽器返回刷新瀏覽器其實(shí)就是瀏覽器將原來(lái)form表單的信息重新發(fā)送了一遍

注銷也就是干掉原來(lái)的session

// 注銷
 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");
 } 

當(dāng)注銷后重定向到一個(gè)jsp頁(yè)面是生成session與原來(lái)的session是不同的(jsp頁(yè)面session默認(rèn)是開啟的) 

也就是說注銷后點(diǎn)擊瀏覽器返回刷新的session是新的session,從這個(gè)角度出發(fā)思考解決辦法

我在原來(lái)的session里放一段數(shù)據(jù),第一次登陸能獲取到這段數(shù)據(jù),注銷后原來(lái)的session沒了,點(diǎn)擊瀏覽器返回刷新,新的session里沒有放數(shù)據(jù),獲取的值就是null

將原來(lái)的session里的數(shù)據(jù)與新的session值進(jìn)行匹配,一個(gè)有值,一個(gè)為null,肯定會(huì)匹配失敗,這時(shí)可以給用戶友好的提示,讓用戶重新登錄即可。

那么原來(lái)session里的數(shù)據(jù)如何在注銷后(注銷了原來(lái)的session就沒了)保存呢?考慮在表單里增加一個(gè)隱藏域,將原來(lái)的session里的數(shù)據(jù)放在該隱藏域中,這樣注銷后點(diǎn)擊瀏覽器返回刷新,瀏覽器會(huì)自動(dòng)把原來(lái)session里的數(shù)據(jù)提交一遍,無(wú)需自己手動(dòng)保存(事實(shí)上手動(dòng)保存可能得放在servletContext應(yīng)用上下文中,沒試過)

有點(diǎn)類似于解決表單重復(fù)提交的一種辦法,但是這里不能把原來(lái)的session里數(shù)據(jù)干掉,因?yàn)樽N前后不是同一個(gè)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中,給出友好提示并重定向到登錄頁(yè)面

  HttpSession session = request.getSession();
  //解決注銷后后退刷新瀏覽器重復(fù)登錄的問題
  //給一個(gè)隱藏輸入域,后臺(tái)獲取隱藏域的值
  //注銷后后退刷新瀏覽器會(huì)生成新的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", "您已注銷,請(qǐng)重新登錄,2秒后轉(zhuǎn)向登錄頁(yè)面<meta http-equiv='Refresh' content=2;url="
       + request.getContextPath() + "/client/login.jsp>");
   request.getRequestDispatcher("/client/message.jsp").forward(
     request, response);
   return;
  } 

測(cè)試:

登錄

 

注銷后點(diǎn)擊瀏覽器返回刷新,瀏覽器會(huì)提示是否重新發(fā)送數(shù)據(jù)

 

點(diǎn)擊重新發(fā)送

 

這樣就解決了注銷后點(diǎn)擊瀏覽器返回刷新用戶重新登錄的問題。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

潜江市| 弋阳县| 云梦县| 尚义县| 襄汾县| 平阴县| 大关县| 潮州市| 新乡市| 玉树县| 万州区| 聂拉木县| 黑河市| 诸城市| 巴林左旗| 通化市| 建水县| 南部县| 罗甸县| 梁山县| 鲁甸县| 海兴县| 樟树市| 抚州市| 岱山县| 清远市| 台东县| 晋城| 民权县| 施秉县| 同心县| 黄浦区| 西丰县| 松溪县| 枣庄市| 泌阳县| 大洼县| 电白县| 广饶县| 通江县| 油尖旺区|