解决用户注销后点击浏览器返回刷新页面重复登录的问题
2016-09-19 08:36
686 查看
最近在写一个购书网站,测试注销功能时点击浏览器返回刷新浏览器,会发现原本已经注销的用户又重新登录了
想了很久在网上也找了很多办法,不过网上给出的办法大多是用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;
}
测试:
登录
注销后点击浏览器返回刷新,浏览器会提示是否重新发送数据
点击重新发送
这样就解决了注销后点击浏览器返回刷新用户重新登录的问题
相关文章推荐
- javaweb用户注销后点击浏览器返回刷新页面重复登录问题的解决方法
- 注销登录后点击浏览器页面依然能后退的解决办法
- 禁用页面缓存。目的:用户登录后退出。点击浏览器后退按钮造成的问题
- js实现用户点击浏览器后退时刷新页面问题
- 禁用页面缓存。目的:用户登录后退出。点击浏览器后退按钮造成的问题
- 解决苹果手机点击返回键页面不刷新问题
- 解决点击浏览器返回按钮回到上一页面,页面变为初始界面的问题(java+html)
- 注销返回到登录界面后点击浏览器回退时不能再次进入原页面的方法
- 浏览器点击百度搜索结果之后,原搜索页面出现重定向乱码不断刷新问题的分析和解决
- 解决:在点击用户退出登录时,再按浏览器的后退按钮,仍然能够看到之前的页面
- 解决刷新页面造成的数据重复提交问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- 基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
- 解决浏览器返回时重复提交的问题 - [项目相关]
- (解决)退出系统后,点击IE返回后,又返回到原页面的问题
- asp.net 退出登陆(解决退出后点击浏览器后退问题仍然可回到页面问题)
- asp.net 退出登陆(解决退出后点击浏览器后退仍然可回到页面问题)
- 判断用户是否登录 及 解决用户重复登录问题
- SubmitOncePage:解决刷新页面造成的数据重复提交问题