在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截);一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会返回登录页面的HTML代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤:
1.拦截器代码
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
Map<String, Object> session = ActionContext.getContext().getSession();
if (UserAction.class == invocation.getAction().getClass()) {
return invocation.invoke();
}
if (session.get("USER") == null) {
if (isAjaxRequest(request)) {
response.setHeader("sessionstatus", "timeout");
return null;
} else {
return Action.LOGIN;
}
}
return invocation.invoke();
}
private boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}
再用一个全局的方法来处理,session超时要跳转的页面。
jquery 可以用$.ajaxSetup 方法
- //全局的ajax访问,处理ajax清求时sesion超时
- $.ajaxSetup({
- contentType:"application/x-www-form-urlencoded;charset=utf-8",
- complete:function(XMLHttpRequest,textStatus){
- var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus,
- if(sessionstatus=="timeout"){
- //如果超时就处理 ,指定要跳转的页面
- window.location.replace("${path}/common/login.do");
- }
- }
- }
- });