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


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

想了很久在網上也找了很多辦法,不過網上給出的辦法大多是用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里的數據提交一遍,無需自己手動保存(事實上手動保存可能得放applicationContext應用上下文中,沒試過)

有點類似於解決表單重復提交的一種辦法,這里也能把原來的session里數據干掉,因為雖然注銷前后不是同一個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;
        }

測試:

登錄

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

點擊重新發送

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM