以前的项目用的是springsecurity3.0,session超时自动跳转的登录页(这个页面可配),后来页面前端用dwz框架了,各种提交都是ajax提交,session超时再点击就会报错,我要实现的是ajax提交被拦截,判断session是否超时,如果超时返回到登录页面。
1.定义struts2拦截器(网上例子很多)
代码如下:
package com.sf.emp.utils;
import javax.servlet.http.HttpServletRequest;
import org.springside.modules.utils.web.struts2.Struts2Utils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 判断session是否超时的拦截器
* 超时跳到登录页面
* @author gshen
*/
public class SessionIterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 7579862236766378267L;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("into 拦截器 。。。。。");
HttpServletRequest request = Struts2Utils.getRequest();
if ("XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With")) || request.getParameter("ajax") != null) {
if(Struts2Utils.getSession() == null || LoginUserHolder.getLoginUser() == null){
Ret.ret301("请求超时!请重新登录!");
return null;
}
}
return actionInvocation.invoke();
}
}
注意:Ret.ret301("");方法封装的是dwz框架的ajax相应字符串,类型是301,例如:{"statusCode":"301", "message":"Session Timeout! Please re-sign in!"},用PrintWriter类返回给前台。
2.然后配置struts.xml
代码如下:
<!-- 用于CRUD Action的parent package --> <package name="crud-default" extends="convention-default"> <!-- 基于paramsPrepareParamsStack, 增加store interceptor保证actionMessage在redirect后不会丢失 --> <interceptors> <interceptor name="sessionout" class="com.sf.emp.utils.SessionIterceptor" /> <interceptor-stack name="crudStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="store"> <param name="operationMode">AUTOMATIC</param> </interceptor-ref> <interceptor-ref name="paramsPrepareParamsStack" /> <interceptor-ref name="sessionout"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="crudStack" /> </package>
声明此拦截器,并放到堆栈最底层,让其首先走这个拦截器。
注意:调试的时候先把session超时时间设置为1分钟,这个可以在web.xml里设置:
<!-- session超时定义,单位为分钟 --> <session-config> <session-timeout>20</session-timeout> </session-config>
3.测试:
登录后,等一分钟,点击出现登录超时,并跳转到了登录页面。
如果想session超时之后设置页面不跳转,而是弹出框登录,请在dwz的初始化页面内修改:
<script type="text/javascript">
$(function(){
DWZ.init("dwz.frag.xml", {
// loginUrl:"loginsub.html", loginTitle:"登录", // 弹出登录对话框
loginUrl:"login.html", // 跳到登录页面
statusCode:{ok:200, error:300, timeout:301}, //【可选】
pageInfo:{pageNum:"page.pageNum", numPerPage:"page.numPerPage", orderField:"orderField", orderDirection:"orderDirection"}, //【可选】
debug:false, // 调试模式 【true|false】
callback:function(){
initEnv();
$("#themeList").theme({themeBase:"themes"});
}
});
});
</script>
这样就完成了,原创希望能给大家带来帮助,转载请著名出处http://shen84121062.iteye.com/blog/1166554