Web应用登出后防止浏览器后退
2013-07-16 18:12
281 查看
通常情况下,浏览器会对页面进行缓存,此时可以通过后退访问刚才的页面,如:Web应用登出后后退能够访问刚才被缓存的页面,这样在有些情况下是不够安全的,解决防止后退的办法如下:
首先要将上面四行代码加在JSP中,或者Struts的action中,我个人是加在了action里。为一个基于Struts的Web应用添加一个处理退出问题的框架可以优雅地不费气力的实现。这部分归功于Struts是采用MVC设计模式的因此将模型和视图清晰的分开。另外,Java是一个面向对象的语言,其支持继承,可以比JSP中的脚本更为容易地实现代码重用。
通过使用类继承机制,其他类可以继承基本类BaseAction中的通用逻辑来设置HTTP头信息以及检索HttpSession对象中的username字符串。这个基本类是一个抽象类并定义了一个抽象方法executeAction()。所有继承自基类的子类都应实现exectuteAction()方法而不是覆盖它。下面基类的部分代码:
登出系统时注意清除保存用户证书的地方,我是存在了session里。我登出是做了如下操作:
另外要配置一个拦截器,来保证已登出的用户不能后退进系统:
当做到上面编码之后,已经可以解决99%的问题了,不过当浏览器点后退对应的是登录后的action时,由于这个action做了用户名密码的认证,后退键将用户名密码又提交了回来,因此还会登录进系统,拦截后退便失败。于是,我们可以做一个时间来验证一下这个请求是否是正常的登录请求:
结论
本文阐述了解决退出问题的方案,尽管方案简单的令人惊讶,但却在所有情况下都能有效地工作。无论是对JSP还是Struts,所要做的不过是写一段不超过50行的代码以及一个记录用户最后登陆时间的方法。在Web应用中混合使用这些方案能够使拥护的私人数据不致泄露,同时,也能增加用户的经验
response.setHeader("Cache-Control","no-cache"); //不对页面进行缓存,再次访问时将从服务器重新获取最新版本 response.setHeader("Cache-Control","no-store"); //任何情况下都不缓存页面 response.setDateHeader("Expires", 0); //使缓存过期 response.setHeader("Pragma","no-cache"); //HTTP 1.0 向后兼容
首先要将上面四行代码加在JSP中,或者Struts的action中,我个人是加在了action里。为一个基于Struts的Web应用添加一个处理退出问题的框架可以优雅地不费气力的实现。这部分归功于Struts是采用MVC设计模式的因此将模型和视图清晰的分开。另外,Java是一个面向对象的语言,其支持继承,可以比JSP中的脚本更为容易地实现代码重用。
通过使用类继承机制,其他类可以继承基本类BaseAction中的通用逻辑来设置HTTP头信息以及检索HttpSession对象中的username字符串。这个基本类是一个抽象类并定义了一个抽象方法executeAction()。所有继承自基类的子类都应实现exectuteAction()方法而不是覆盖它。下面基类的部分代码:
public abstract class BaseAction { ... { response.setHeader("Cache-Control","no-cache"); response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires", 0); response.setHeader("Pragma","no-cache"); } ... }
登出系统时注意清除保存用户证书的地方,我是存在了session里。我登出是做了如下操作:
public String logout() { ActionContext context = ActionContext.getContext(); Map session = context.getSession(); session.remove("User");//User中有用户名和密码等信息 //ActionContext.getContext().getSession().clear();//清空session //ServletActionContext.getRequest().getSession().invalidate();//使HttpSession失效 return "logout"; }
另外要配置一个拦截器,来保证已登出的用户不能后退进系统:
public class LoginSessionFilter implements javax.servlet.Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; String contextPath = req.getSession().getServletContext().getContextPath(); String servletPath = req.getServletPath(); User user = (User) req.getSession().getAttribute("User "); // 如果是登录首页不用拦截 if (servletPath.contains("login.action")) { chain.doFilter(request, response); } else { // 如果user == null说明该用户已经登出了,我强制它返回登录页面 // 否则不拦截 if (user == null) { res.sendRedirect(contextPath + " login.action"); } else { chain.doFilter(request, response); } } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
当做到上面编码之后,已经可以解决99%的问题了,不过当浏览器点后退对应的是登录后的action时,由于这个action做了用户名密码的认证,后退键将用户名密码又提交了回来,因此还会登录进系统,拦截后退便失败。于是,我们可以做一个时间来验证一下这个请求是否是正常的登录请求:
public class LoginAction extends BaseAction { private String userName; // 用户名 private String password; // 密码 private long logonTime;// 登陆时间 private static long lastLogonTime ; // 上次登录时间 public String logon() { // 如果本次登录的时间大于最后一次登录的时间,说明是正常登录 // 否则说明该请求是浏览器缓存的历史,我们要跳回登录页面 if (logonTime > lastLogonTime) { lastLogonTime = logonTime; } else { return "登录页面"; } ... ... return ""; } }
结论
本文阐述了解决退出问题的方案,尽管方案简单的令人惊讶,但却在所有情况下都能有效地工作。无论是对JSP还是Struts,所要做的不过是写一段不超过50行的代码以及一个记录用户最后登陆时间的方法。在Web应用中混合使用这些方案能够使拥护的私人数据不致泄露,同时,也能增加用户的经验
相关文章推荐
- 解决web应用用户退出系统后浏览器后退问题
- JavaWeb页面中防止点击Backspace网页后退情况
- 防止点击浏览器后退按钮 后退页面的js
- JS防止表单提交之后用户点击浏览器后退按钮再次提交
- (15)session原理,应用(防止用户非法登录、验证码、关闭浏览器再开启浏览器还能访问之前的session)
- 防止页面后退(使浏览器后退按钮失效)
- web安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案
- Web应用中防止用户重复登录的简单实现方法
- 防止用户按浏览器后退按钮回到登陆页面
- selenium_webdriver(python)获取元素属性值,浏览器窗口控制、网页前进后退,title/url打印
- 如何使用转发和 web 浏览器控件的后退按钮
- 企业Web应用以谁为中心:服务器?浏览器?
- 关于Java web项目,怎么防止在浏览器中直接敲地址进入后台
- web前端浏览器缓存应用(带图文解说)
- 防止浏览器的后退按钮的一些看法
- html5 Web开发:防止浏览器假死的方法
- 通过location.replace禁止浏览器后退防止重复提交
- android WebView 应用内点击超链接不调用系统浏览器
- Web应用中防止用户重复登录的简单实现方法
- javascript阻止浏览器后退事件防止误操作清空表单