说明:测试设置失效时间为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; }