-
Web应用登出后防止浏览器撤退猬缩
添加时间:2013-7-16 点击量:凡是景象下,浏览器会对页面进行缓存,此时可以通事撤退猬缩接见刚才的页面,如: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应用中混淆应用这些规划可以或许使拥戴的私家数据不致泄漏,同时,也能增长用户的经验