Ajax Session失效跳转登录页面的方法
程序员文章站
2022-05-26 09:53:24
在struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(session失效拦截);一般请求的话,如果session失效时,我们会...
在struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(session失效拦截);一般请求的话,如果session失效时,我们会跳到登录页面,可是如果我们采用ajax请求时,将会返回登录页面的html代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤:
一、建立拦截器
package com.xxx.planeap.interceptor; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.log4j.logger; import org.apache.struts2.servletactioncontext; import com.opensymphony.xwork2.actioncontext; import com.opensymphony.xwork2.actioninvocation; import com.opensymphony.xwork2.actionsupport; import com.opensymphony.xwork2.interceptor.abstractinterceptor; import com.xxx.common.contants.constantskey; import com.xxx.common.contants.sessionkey; import com.xxx.planeap.domain.user; import com.xxx.planeap.security.securitycontextutil; /** * * @author goma oma1989@yeah.net * @version v1.0 * @since 2012-05-31 * */ public class securityinterceptor extends abstractinterceptor { private static final long serialversionuid = 1l; private logger logger = logger.getlogger(securityinterceptor.class); @override public string intercept(actioninvocation invocation) throws exception { // todo auto-generated method stub string classname = invocation.getaction().getclass().getname(); string action = classname.substring(classname.lastindexof(".")+1,classname.length()); string actionname = invocation.getproxy().getactionname(); string result; httpservletrequest request = servletactioncontext.getrequest(); httpservletresponse response = servletactioncontext.getresponse(); string type = request.getheader("x-requested-with"); user user = (user) actioncontext.getcontext().getsession().get(sessionkey.current_user); if (user == null) { logger.debug("security checked: need to login"); if ("xmlhttprequest".equalsignorecase(type)) {// ajax request process response.setheader("sessionstatus", constantskey.msg_time_out); result = null; } else {// normal request process result = actionsupport.login; } } else { logger.debug("security checked: user has logined"); securitycontextutil.setcurrentuser(user); boolean hanperm = securitycontextutil.hasperm(action, actionname); logger.debug("security checked: permission---"+action+"."+actionname+"="+hanperm); result = invocation.invoke(); } return result; } }
二、定义全局ajax请求结束处理方法
//全局的ajax访问,处理ajax清求时session超时 $.ajaxsetup({ contenttype:"application/x-www-form-urlencoded;charset=utf-8", complete:function(xmlhttprequest,textstatus){ //通过xmlhttprequest取得响应头,sessionstatus var sessionstatus=xmlhttprequest.getresponseheader("sessionstatus"); if(sessionstatus=="timeout"){ //这里怎么处理在你,这里跳转的登录页面 window.location.replace(planeap.getactionuri("login")); } } });
也就是ajax发送请求时如果拦截返回一个表示就跳转,否则执行正常操作。
上一篇: IE8/IE9下Ajax缓存问题
下一篇: IE8用ajax访问不能每次都刷新的问题