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"); } } );