javaweb用戶注銷后點(diǎn)擊瀏覽器返回刷新頁(yè)面重復(fù)登錄問(wèn)題的解決方法
最近在寫一個(gè)購(gòu)書(shū)網(wǎng)站,測(cè)試注銷功能時(shí)點(diǎn)擊瀏覽器返回刷新瀏覽器,會(huì)發(fā)現(xiàn)原本已經(jīng)注銷的用戶又重新登錄了
想了很久在網(wǎng)上也找了很多辦法,不過(guò)網(wǎng)上給出的辦法大多是用js實(shí)現(xiàn)注銷后禁止用戶點(diǎn)擊游覽器返回
這個(gè)辦法雖然可行,但并不是在后臺(tái)真正的解決這個(gè)問(wèn)題,有一種防君子不防小人的感覺(jué)
下面把自己實(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)是開(kāi)啟的)
也就是說(shuō)注銷后點(diǎn)擊瀏覽器返回刷新的session是新的session,從這個(gè)角度出發(fā)思考解決辦法
我在原來(lái)的session里放一段數(shù)據(jù),第一次登陸能獲取到這段數(shù)據(jù),注銷后原來(lái)的session沒(méi)了,點(diǎn)擊瀏覽器返回刷新,新的session里沒(méi)有放數(shù)據(jù),獲取的值就是null
將原來(lái)的session里的數(shù)據(jù)與新的session值進(jìn)行匹配,一個(gè)有值,一個(gè)為null,肯定會(huì)匹配失敗,這時(shí)可以給用戶友好的提示,讓用戶重新登錄即可。
那么原來(lái)session里的數(shù)據(jù)如何在注銷后(注銷了原來(lái)的session就沒(méi)了)保存呢?考慮在表單里增加一個(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)用上下文中,沒(méi)試過(guò))
有點(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ù)登錄的問(wèn)題 //給一個(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)擊瀏覽器返回刷新用戶重新登錄的問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中的@Configuration注解詳解
這篇文章主要介紹了SpringBoot中的@Configuration注解詳解,Spring Boot推薦使用JAVA配置來(lái)完全代替XML 配置,JAVA配置就是通過(guò) @Configuration和 @Bean兩個(gè)注解實(shí)現(xiàn)的,需要的朋友可以參考下2023-08-08淺談Java中BigDecimal類的簡(jiǎn)單應(yīng)用
這篇文章主要介紹了淺談Java中BigDecimal類的簡(jiǎn)單應(yīng)用,BigDecimal是由任意精度的整數(shù)非標(biāo)度值和32位的整數(shù)標(biāo)度組成,如果為零或正數(shù),則標(biāo)度是小數(shù)點(diǎn)后的位數(shù),如果為負(fù)數(shù),則將該數(shù)的非標(biāo)度值乘以?10的負(fù)scale次冪,需要的朋友可以參考下2023-07-07MyBatis中的循環(huán)插入insert foreach問(wèn)題
這篇文章主要介紹了MyBatis中的循環(huán)插入insert foreach問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11基于JSON和java對(duì)象的互轉(zhuǎn)方法
下面小編就為大家?guī)?lái)一篇基于JSON和java對(duì)象的互轉(zhuǎn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09解決MyEclipse6.5無(wú)法啟動(dòng),一直停留剛開(kāi)始啟動(dòng)界面的詳解
本篇文章是對(duì)解決MyEclipse6.5無(wú)法啟動(dòng),一直停留剛開(kāi)始啟動(dòng)界面的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Maven編譯遇到Process terminated問(wèn)題(四種情況全部解決)
這篇文章主要介紹了Maven編譯遇到Process terminated問(wèn)題(四種情況全部解決),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java.io.File的renameTo方法移動(dòng)文件失敗的解決方案
這篇文章主要介紹了java.io.File的renameTo方法移動(dòng)文件失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot實(shí)現(xiàn)配置文件的替換
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)配置文件的替換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12