在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截);一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会返回登录页面的HTML代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤:

一、建立拦截器

 

Java代码  

  1. package com.xxx.planeap.interceptor;  

  2.   

  3. import javax.servlet.http.HttpServletRequest;  

  4. import javax.servlet.http.HttpServletResponse;  

  5.   

  6. import org.apache.log4j.Logger;  

  7. import org.apache.struts2.ServletActionContext;  

  8.   

  9. import com.opensymphony.xwork2.ActionContext;  

  10. import com.opensymphony.xwork2.ActionInvocation;  

  11. import com.opensymphony.xwork2.ActionSupport;  

  12. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  

  13. import com.xxx.common.contants.ConstantsKey;  

  14. import com.xxx.common.contants.SessionKey;  

  15. import com.xxx.planeap.domain.User;  

  16. import com.xxx.planeap.security.SecurityContextUtil;  

  17.   

  18. /** 

  19.  *  

  20.  * @author Goma [email protected] 

  21.  * @version v1.0 

  22.  * @since 2012-05-31 

  23.   

  24.  *  

  25.  */  

  26. public class SecurityInterceptor extends AbstractInterceptor {  

  27.     private static final long serialVersionUID = 1L;  

  28.     private Logger logger = Logger.getLogger(SecurityInterceptor.class);  

  29.   

  30.     @Override  

  31.     public String intercept(ActionInvocation invocation) throws Exception {  

  32.         // TODO Auto-generated method stub  

  33.   

  34.         String className = invocation.getAction().getClass().getName();  

  35.         String action = className.substring(className.lastIndexOf(".")+1,className.length());  

  36.         String actionName = invocation.getProxy().getActionName();  

  37.           

  38.         String result;  

  39.         HttpServletRequest request = ServletActionContext.getRequest();  

  40.         HttpServletResponse response = ServletActionContext.getResponse();  

  41.         String type = request.getHeader("X-Requested-With");  

  42.         User user = (User) ActionContext.getContext().getSession().get(SessionKey.CURRENT_USER);  

  43.         if (user == null) {  

  44.             logger.debug("SECURITY CHECKED: NEED TO LOGIN");  

  45.             if ("XMLHttpRequest".equalsIgnoreCase(type)) {// AJAX REQUEST PROCESS  

  46.                 response.setHeader("sessionstatus", ConstantsKey.MSG_TIME_OUT);  

  47.                 result = null;  

  48.             } else {// NORMAL REQUEST PROCESS  

  49.                 result = ActionSupport.LOGIN;  

  50.             }  

  51.         } else {  

  52.             logger.debug("SECURITY CHECKED: USER HAS LOGINED");  

  53.             SecurityContextUtil.setCurrentUser(user);  

  54.             boolean hanPerm = SecurityContextUtil.hasPerm(action, actionName);  

  55.             logger.debug("SECURITY CHECKED: PERMISSION---"+action+"."+actionName+"="+hanPerm);  

  56.             result = invocation.invoke();  

  57.         }  

  58.         return result;  

  59.     }  

  60. }  

 

 

二、定义全局AJAX请求结束处理方法

 

Js代码  

  1. //全局的AJAX访问,处理AJAX清求时SESSION超时  

  2. $.ajaxSetup({  

  3.     contentType:"application/x-www-form-urlencoded;charset=utf-8",  

  4.     complete:function(XMLHttpRequest,textStatus){  

  5.           //通过XMLHttpRequest取得响应头,sessionstatus             

  6.           var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");   

  7.           if(sessionstatus=="timeout"){  

  8.                //这里怎么处理在你,这里跳转的登录页面  

  9.                window.location.replace(PlanEap.getActionURI("login"));  

  10.        }  

  11.     }  

  12. });