正确而优美的解决logout问题的思路

    通常情况下,写基于session的logout问题,都是吧对应的session.removeAttribute移除,然后再session.invalidate();

   问题提出:由于浏览器都提供了,back按钮,所以即便是执行了该代码也可能被恶意用户通过点击“后退”按钮看到相应的数据。这在有些情况下是允许的,但是很多情况都是不允许的,也是有违初衷的。

   分析原因:浏览器的缓存。

   解决方法:通过服务端第一次向浏览器发送数据时就告诉它不要缓存。

   以下的代码试图使得浏览器不要缓存页面。

response.setHeader( " Cache-Control " , " no-cache " );  //使得浏览器重新获取该页
    response.setHeader( " Cache-Control " , " no-store " );  //使得浏览器不缓存该页
    response.setDateHeader( " Expires " 0 );  // 导致代理缓存认为该页为"stale"状态
response.setHeader( " Pragma " , " no-cache " );  // HTTP 1.0 的回退功能失效

    问题提出:以上代码工作在一般的页面上没有问题了,但是如果是一页表单提交的目标,那么浏览器回提示你是不是重新提交表单,这样数据仍然有些危险。

    分析原因:浏览器缓存表单的数据导致的。

    解决方法:在一些重要的场合,比如登陆时,在记录中多写一列为lastSubmit,记录最后访问修改的时间。在表单中放置一个隐藏文本框,取当前系统时间;在修改前核对系统记录的时间比它靠前,才继续;修改时更新该时间间,这样就可以避免重复的数据提交了。(时间可以通过:System.currentTimeMillis() 获得)

   后记

   1) 由于很多页都要写缓存设置模块,可以通过<jsp:include/>标签在jsp中写,稍显混乱。

    2) 在Struts中继承一个Action的基类把这段代码添加进去就好了,需要使用的地方继承自自定义类就可以了。(重载excute方法,在其中引用自己的抽象方法,例如excuteAction,在子类中需要实现excuteAction方法就可以了。)

    局限性:在Opera中,设计浏览器的思路不是Cache失效它就不显示,所以。。。可能是不行的。

    水平有限,请多包涵。

    Enjoy!^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值