解决用户注销后点击浏览器返回刷新页面重复登录的问题详解编程语言

注销后点击浏览器返回刷新浏览器其实就是浏览器将原来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,但是表单里记住了原来的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>
        <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;
    }

解决用户注销后点击浏览器返回刷新页面重复登录的问题详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/14810.html

(0)
上一篇 2021年7月19日 17:10
下一篇 2021年7月19日 17:10

相关推荐

发表回复

登录后才能评论