最近在寫一個購書網站,測試註銷功能時點擊瀏覽器返回刷新瀏覽器,會發現原本已經註銷的用戶又重新登錄了
想了很久在網上也找了很多辦法,不過網上給出的辦法大多是用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><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; }測試:
登入
註銷後點擊瀏覽器返回刷新,瀏覽器會提示是否重新發送數據
點擊重新發送
這樣就解決了註銷後點擊瀏覽器返回刷新用戶重新登錄的問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。