通常情况下,浏览器会对页面进行缓存,此时可以通过后退访问刚才的页面,如: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应用登出后防止浏览器后退的更多相关文章

  1. web测试误区:浏览器后退键退出系统会话失效

    通过最近测试的项目,认识到实际:浏览器后退键退出系统,会话仍旧有效.打破了之前认为浏览器后退键就会退出系统登录的认知. 一,了解Cookie和Session的作用,具体来说cookie机制采用的是在客 ...

  2. 华为eNSP的防火墙(USG6000V)如何使用Web界面登入

    文章目录 华为eNSP的防火墙(USG6000V)如何使用Web界面登入 前言 一.使用步骤 1.导入USG6000V的镜像包 总结 前言 在华为的eNSP的模拟器上如何使用Web界面去管理与使用模拟 ...

  3. js禁止Backspace键使浏览器后退

    在项目中遇到按下Backspace键让浏览器后退的问题,上网搜了几种解决方案都不太理想.于是集众人之智,采众家之长,归纳如下: 这里主要参考博客http://q821424508.iteye.com/ ...

  4. 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况

    对比audio标签 和 Web Audio API 各平台浏览器的支持情况:   audio element Web Audio API desktop browsers Chrome 14 Yes  ...

  5. modern.IE – Web 开发必备的 IE 浏览器测试工具

    modern.IE 是微软推出的一个开发人员中心,提供免费的工具和资源,旨在使您能够花更少的时间来测试各种版本的 Internet Explorer,并留出更多时间在现代 Web 上构建重要的内容.m ...

  6. 浏览器后退按钮导致jquery动态添加的select option值丢失的解决方法

    监控浏览器返回功能 判断浏览器返回功能 禁用浏览器的后退按钮 JS禁止浏览器后退键 http://volunteer521.iteye.com/blog/830522/ 浏览器返回功能 判断上一页面来 ...

  7. 利用js实现禁用浏览器后退

    原博主链接为:http://blog.csdn.net/zc474235918/article/details/53138553 现在很多的内部系统,一些界面,都是用户手动点击退出按钮的.但是为了避免 ...

  8. 利用js实现 禁用浏览器后退

    现在很多的内部系统,一些界面,都是用户手动点击退出按钮的.但是为了避免,用户误操作 点击浏览器后退,或者用鼠标手势后退什么的.容易出现误操作.        所以在有些页面上,适当的禁用浏览器的后退, ...

  9. 利用js实现 禁用浏览器后退 浏览器返回

    现在很多的内部系统,一些界面,都是用户手动点击退出按钮的.但是为了避免,用户误操作 点击浏览器后退,或者用鼠标手势后退什么的.容易出现误操作.        所以在有些页面上,适当的禁用浏览器的后退, ...

随机推荐

  1. iOS uiscrollView 嵌套 问题 的解决

    苹果官方文档里面提过,最好不要嵌套scrollView,特别提过UITableView和UIWebView,因为在滑动时,无法知道到底是希望superScrollView滑动还是subScrollVi ...

  2. iOS 自定义 shareSDK 容器

    - (void)initializePlat { //添加新浪微博应用 [ShareSDK connectSinaWeiboWithAppKey:@"3201194191" app ...

  3. oc语言复制视频文件

    void copyFile() { NSString *home=NSHomeDirectory(); NSString *path=[NSString stringWithFormat:@" ...

  4. webSocket开源框架:SocketRocket 简单的使用

    需要用到webSocket,所以搜集了一下使用方法, git下载地址:square/SocketRocket gitHUB 上没有看懂,就要 cocoaPod 导入了 socketRocket 导入这 ...

  5. UITableView 的增删改 自定义UITableViewCell

    1.UITableView的增删改 //设置编辑模式 [self.tableView setEditing:YES animated:YES]; //可以不写 - (BOOL)tableView:(U ...

  6. java 集合类简单的分析1

          java中的集合类是很常见的,ArrayList,HashSet,HashMap等,现在就让我们来看下他们的各个类之间的关系图.      Collection ├List │├Linke ...

  7. 连续区间覆盖染色问题 ------ SHUOJ 1716

    题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1716 [题意] 1到N的区间,一种操作让编号从a到b的数变为z,但不会低于2,问多次操 ...

  8. 【思路,dp,BigInteger】ZOJ - 2598 Yet Another Digit

    [redundant binary - 冗余二进制]:由0,1,2构成的二进制形式,基数还是2. 现给你一十进制数n,问其可转化成多少种冗余二进制形式. 首先要想到:2x = 2*2x-1 也就是说 ...

  9. 【CSS3】---层模型position之fixed固定定位、absolute绝对定位和relative相对定位

    什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...

  10. 正则表达式删除指定的HTML 标签

    1.抓取某网页的数据后(比如描述),如果照原样显示的话,可能会因为它里面包含没有闭合的HTML标签而打乱了格式,也可能它里面用了比较让人 "费解" 的HTML标签,把预订的格式搅乱 ...