欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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发送请求时如果拦截返回一个表示就跳转,否则执行正常操作。