攔截器攔截的ajax請求無法重定向到登錄頁面


1、處理ajax請求重定向需要結合前端代碼ajax方法進行處理。

2、后端處理:給請求頭塞參數

其中重要的兩個參數:REDIRECT、CONTEXTPATH

1)添加重定向標識:“REDIRECT”,告訴ajax我是重定向:response.setHeader("REDIRECT", "REDIRECT");
2)添加請求路徑:“CONTEXTPATH”,告訴ajax重定向路徑:response.setHeader("CONTEXTPATH", "跳轉路徑");
3)將自定義請求頭REDIRECT、CONTEXTPATH暴露給外部:response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
4)后端代碼示例如下:

//對於請求是ajax請求重定向問題的處理方法
public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //獲取當前請求的路徑
        //logger.error("請求類型:"+request.getHeader("X-Requested-With"));
        response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
        //告訴ajax我是重定向
        response.setHeader("REDIRECT", "REDIRECT");
        //告訴ajax我重定向的路徑
        String url = "https://xxx.xxx.xxx/";//重定向路徑
        response.setHeader("CONTEXTPATH", url);
        response.getWriter().write(1);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
 
    }
// 在業務處理器處理請求之前被調用
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        ......校驗未登錄
        if(未登錄){
        redirect(request,response);//調用重定向問題處理方法
        return false;
    }else{
         return true;//請求放行
    }
       
}
 //判斷請求是不是ajax請求
String requestType = request.getHeader("X-Requested-With");
if("XMLHttpRequest".equals(requestType)){
    System.out.println("AJAX請求..");
}else{
    System.out.println("非AJAX請求..");
    //此時requestType為null
}

3、前端代碼處理:ajax請求,自然是在ajax方法中做處理。后端傳了參數的參數就是為了讓前端來接收。

前端處理步驟如下:

1)在ajax方法中添加“complete ”,complete 在ajax中無論ajax請求成功或失敗都會執行。

2) 在complete 中獲取響應頭中的參數 REDIRECT ,該參數是我們在攔截器攔截成功后塞進去,用來標識該請求是重定向請求的。

3) 獲取請求路徑,並跳轉至重定向頁面

4)前端代碼示例如下:

$.ajax({
                url : "......",
                type : "post",
                data : {
                    ......
                },
                success : function(text) {
                    ......
                        },
                error : function(e, f, g) {
                    ......
                },
                complete : function(xhr, status) {
                    alert(status)
                    //攔截器實現超時跳轉到登錄頁面
                    // 通過xhr取得響應頭
                    var REDIRECT = xhr.getResponseHeader("REDIRECT");
                    //如果響應頭中包含 REDIRECT 則說明是攔截器返回的需要重定向的請求
                    if (REDIRECT == "REDIRECT")
                    {
                        var win = window;
                        while (win != win.top)
                        {
                            win = win.top;
                        }                   
                        win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                    }
                }
            });

或者加一個ajax全局處理函數:

 $(document).ajaxComplete( function(event, jqXHR, options){
        //攔截器實現超時跳轉到登錄頁面
        // 通過xhr取得響應頭
        var REDIRECT = jqXHR.getResponseHeader("REDIRECT");
        //如果響應頭中包含 REDIRECT 則說明是攔截器返回的需要重定向的請求
        if (REDIRECT == "REDIRECT")
        {
            var win = window;
            while (win != win.top)
            {
                win = win.top;
            }
            win.location.href = jqXHR.getResponseHeader("CONTEXTPATH");
        }
    } );

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM