以前的项目用的是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