说明:测试设置失效时间为1分钟,登录成功后1分钟去点击操作处罚事件,执行①连接到com.lactec.framework.ac.filter.AuthFilter这个类判断执行的action操作。

      判断session是否为空,超时就返回,我用的是ajax请求:如果是ajax请求响应头会有,x-requested-with;

      设置: rep.setHeader("sessionstatus", "timeout");//在响应头设置session状态

               rep.getWriter().print("登录超时!"); //打印一个返回值,没这一行,在tabs页中无法跳出(导航栏能跳出),具体原因不明

      前台部分通过  XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,给出提示 。

 

① web.XML部分配置代码

 

1 <!-- filter 权限认证 只对amf请求过滤 -->
2 <filter>
3   <filter-name>authFilter</filter-name>
4   <filter-class>com.lactec.framework.ac.filter.AuthFilter</filter-class>
5 </filter>
6   <filter-mapping>
7   <filter-name>authFilter</filter-name>
8 <url-pattern>*.do</url-pattern>
9 </filter-mapping>
10 <!-- session失效时间是30分钟 -->
11 <session-config>
12   <session-timeout>30</session-timeout>
13 </session-config>


 

②java代码




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29




​public​​​​class​​ ​​AuthFilter ​​​​extends​​​​BaseAction ​​​​implements​​​​Filter {     ​


 


​public​​​​void​​ ​​doFilter(ServletRequest request, ServletResponse response,FilterChain chain) ​​​​throws​​​​IOException, ServletException{​


 


​  HttpServletRequest req = (HttpServletRequest) request;​


 


​  HttpServletResponse rep = (HttpServletResponse) response;​




​  String uri = req.getRequestURI();​​​​//获取登录的action​


​if​​​​(uri.indexOf(​​​​"loginAction"​​​​)>=​​​​0​​​​){​


​      chain.doFilter(request, response);​​​​//跳转页面​


​  }​​​​else​​​​{​


​//获取登录用户的Session --基础权限检查,用户没有登陆,被拦截或者session超时请重新登录​


​if​​​​(Utils.isNull(req.getSession()) || Utils.isNull(req.getSession().getAttribute(​​​​"user"​​​​)) ){​


​//如果是ajax请求响应头会有,x-requested-with;​


​if​​​​(req.getHeader(​​​​"x-requested-with"​​​​) != ​​​​null​​​​&& req.getHeader(​​​​"x-requested-with"​​​​).equalsIgnoreCase(​​​​"XMLHttpRequest"​​​​)){​




​        rep.setHeader(​​​​"sessionstatus"​​​​,​​​​"timeout"​​​​);​​​​//在响应头设置session状态​


​        rep.getWriter().print(​​​​"登录超时!"​​​​);​​​​//打印一个返回值,没这一行,在tabs页中无法跳出(导航栏能跳出),具体原因不明​


​      }​


​return​​​​;​


​  }​​​​else​​​​{​


​      chain.doFilter(request, response);​​​​//跳转页面​


 


​      }​


​    }​


 


​  }​


​}​



  

   

③ JS代码部分

$.ajaxSetup({ 
    error: function (XMLHttpRequest, textStatus, errorThrown){
      if(XMLHttpRequest.status==403){
        $.messager.alert('我的消息', '您没有权限访问此资源或进行此操作!', 'success');
        return false;
      }
    },
    complete:function(XMLHttpRequest,textStatus){
      var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus,
      if(sessionstatus=='timeout'){
        //如果超时就处理 ,指定要跳转的页面
        var top = getTopWinow(); //获取当前页面的顶层窗口对象
        $.messager.alert('我的消息', '登录超时-请重新登录!', 'info');
        top.location.href = "http://"+window.location.host+"/crm_web/login_new.html"; //跳转到登陆页面 对多服务器同样适用
      }
    }
});

/**
* 在页面中任何嵌套层次的窗口中获取顶层窗口
* @return 当前页面的顶层窗口对象
*/
function getTopWinow(){
        var p = window;
        while(p != p.parent){
            p = p.parent;
        }
    return p;
   }