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应用中混淆应用这些规划可以或许使拥戴的私家数据不致泄漏,同时,也能增长用户的经验

    我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
    分享到: