国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

javaweb用戶注銷后點擊瀏覽器返回刷新頁面重復登錄問題的解決方法

2019-11-26 13:49:32
字體:
來源:轉載
供稿:網友

最近在寫一個購書網站,測試注銷功能時點擊瀏覽器返回刷新瀏覽器,會發現原本已經注銷的用戶又重新登錄了 

想了很久在網上也找了很多辦法,不過網上給出的辦法大多是用js實現注銷后禁止用戶點擊游覽器返回 

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

下面把自己實現的方法記錄下來 

原理: 

注銷后點擊瀏覽器返回刷新瀏覽器其實就是瀏覽器將原來form表單的信息重新發送了一遍 

注銷也就是干掉原來的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"); } 

當注銷后重定向到一個jsp頁面是生成session與原來的session是不同的(jsp頁面session默認是開啟的) 

也就是說注銷后點擊瀏覽器返回刷新的session是新的session,從這個角度出發思考解決辦法 

我在原來的session里放一段數據,第一次登陸能獲取到這段數據,注銷后原來的session沒了,點擊瀏覽器返回刷新,新的session里沒有放數據,獲取的值就是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", "您已注銷,請重新登錄,2秒后轉向登錄頁面<meta http-equiv='Refresh' content=2;url="       + request.getContextPath() + "/client/login.jsp>");   request.getRequestDispatcher("/client/message.jsp").forward(     request, response);   return;  } 

測試: 

登錄

 

注銷后點擊瀏覽器返回刷新,瀏覽器會提示是否重新發送數據

 

點擊重新發送

 

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁海县| 房产| 耒阳市| 犍为县| 同江市| 西乌珠穆沁旗| 改则县| 洛扎县| 乳源| 龙州县| 奇台县| 原阳县| 宁蒗| 广昌县| 福泉市| 尚志市| 靖江市| 嘉峪关市| 郓城县| 庆城县| 闻喜县| 大姚县| 西峡县| 陆川县| 枣庄市| 延寿县| 岐山县| 梁山县| 合肥市| 北京市| 阳新县| 容城县| 巩义市| 夹江县| 偃师市| 宜宾县| 高密市| 虹口区| 闵行区| 同德县| 安仁县|