1. 程式人生 > >springMVC session過期跳轉到登入介面

springMVC session過期跳轉到登入介面

1、非ajax的傳統型跳轉和ajax請求資料跳轉

2、使用springMVC攔截器攔截請求,判斷session是否過期

3、使用ajaxSetup 全域性判斷session請求是否過期。

        這種方式不是最好的方式,貌似有三種方式處理ajax重定向的問題,修改jquery原始碼、設定response頭、或者每次ajax增加判斷。我覺得修改jquery原始碼不好,每次判斷又要改大量的前端程式碼,累死-_-||!!,所有我覺得最小程度修改前端程式碼是最好的選擇。所以選擇了設定response頭。

     部分攔截器程式碼:

實現HandlerInterceptor介面,重寫prehandle方法

  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,   
            Object handler) throws SessionTimeoutException, IOException {  
        String requestUrl = request.getRequestURI();    //獲取請求的URL
        for(String url : allowUrls) {   //判斷請求URL是否屬於請求白名單
            if(requestUrl.endsWith(url)||requestUrl.indexOf(url)>=0) {  
                return true;  
            }  
        }  
        String session = String.valueOf(WebUtils.getSessionAttribute(request, "userId")); 
        String session1 = String.valueOf(WebUtils.getSessionAttribute(request, "zmccUser")); 
        if("null".equals(session)  || "null".equals(session1)) {   //判斷session是否過期,如果是null則session過期
        if(request.getHeader("x-requested-with")!=null){  // 非ajax請求比 ajax請求少一個x-requested-with屬性,所以有x-requested-with屬性則為ajax請求
        response.setHeader("sessionstatus", "timeout");  //設定response頭,前臺依此來判斷是否session過期
        return false;
        }else{
        throw new SessionTimeoutException();  //非ajax請求,在我的專案中就是 返回ModelAndView,直接重定向就可以了,丟擲SessionTimeoutException自定義異常,注意這是我自己定義的異常
        }
        
        
        } else {  
            return true;  
        }  
    }  

配置springMVC的XML

  <mvc:interceptors>  
    <mvc:interceptor>  
        <mvc:mapping path="/**/*.do" />  
        <bean class="com.uniware.util.SessionTimeoutInterceptor" >  
            <property name="allowUrls">  
                <list>   <!-- 這些list是可以訪問的白名單,不需要驗證session  -->
                  <value>/login</value>  
                  <value>LoginController</value>
                </list>  
            </property>  
        </bean>  
    </mvc:interceptor>  
</mvc:interceptors>  
<!-- 處理自定義異常,直接跳轉,當然你也可以自己實現這個AbstractHandlerExceptionResolver  -->
    <bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >  
    <property name="exceptionMappings">  
        <props>  
            <prop key="com.uniware.util.SessionTimeoutException">redirect:/login.jsp</prop>  
        </props>  
    </property>  
</bean>  
/** * 設定未來(全域性)的AJAX請求預設選項
 * 主要設定了AJAX請求遇到Session過期的情況
 */
$.ajaxSetup({
  type: 'POST',
  complete: function(xhr,status) {
    var sessionStatus = xhr.getResponseHeader('sessionstatus');
    if(sessionStatus == 'timeout') {
      window.top.location.href = window.top.location;  
    }
  }
});

最後你需要把上面的這段jquery程式碼放到每個請求前,我的專案有一個公共的工具js,我把這段貼在上面就可以了,這樣前端我就加了這一項,但是如果你的每個jsp引入的檔案都不一樣,沒有公共的js。那你就把他貼在jquery.js這種程式碼裡好了,當然最好別這樣做。

如果上面的程式碼或者思路有問題,請您指導。謝謝