【坑】前端使用ajax異步請求以后,springMvc攔截器跳轉頁面無效



前言

本文着重解決前后端分離開發的頁面調整問題。

筆者,在做一個需求,需要對訪問網站,但是沒有登錄的用戶進行攔截,將他們重定向到首頁。

很簡單的一個需求,使用 springMvc 的攔截器即可完成需求;但是在編碼的時候,頁面總是無法進行跳轉。

后來在google上一通搜索,知道了問題的原因,前后端分離,前台使用ajax異步請求的鍋 ;

ajax,何為ajax,簡單說就是局部網頁刷新技術。前后端分離以后,后台逐漸淡化了對頁面邏輯跳轉的控制,將這些交給了前端去做,前台利用ajax,異步請求后台,獲得數據,局部刷新網頁,實現了許多方便的功能;

因此,即使后台進行頁面跳轉的編碼,然后前台請求完畢以后,只會執行 ajax的回調函數,至於后台那些邏輯,對不起,我ajax一概不管滴;

聽到這里,大家也應該猜到應該怎么做了,對,開始甩鍋,跟前端同學大聲的說,這是你的事呀,你在ajax的回調函數里面進行頁面的跳轉啊,你的前台技術是怎么肥四。


$.ajaxSetup( )

在改動 ajax 之前不要着急,如果在上面提到的回調函數里面進行修改,那么前端同學的代碼,就要改動很多,凡是涉及ajax請求的方法,都要加上頁面跳轉的邏輯了。。。

這里使用 $.ajaxSetup( ),可以看着是對 ajax 的增強,對比與 spring事務的后置增強$.ajaxSetup( ) 會在每個 ajax請求完成以后得到執行(是不是感覺就是一個后置增強啊);

將下面的代碼,交給前端童鞋,讓他放到 引入的公共的 js文件里面

// 解決Ajax異步請求 springMvc 不跳轉頁面的問題
$.ajaxSetup( {
	//設置ajax請求結束后的執行動作
    complete :
        function(XMLHttpRequest, textStatus) {
			// 通過XMLHttpRequest取得響應頭,sessionstatus
            var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
            if (sessionstatus == "TIMEOUT") {
                var win = window;
                while (win != win.top){
                    win = win.top;
                }
                win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
            }
        }
});

這段代碼的含義,大抵就是,在 ajax請求完成以后,執行 complete 回調方法,里面進行一些邏輯的判斷;

這里判斷 session 的狀態,如果是超時被銷毀了,則進行頁面的跳轉,跳到 CONTEXTPATH 的值那 ;

session 的狀態以及 CONTEXTPATH 的值,由我們后台同學定義;

如下:在攔截器的preHandle方法中,添加如下邏輯

 		HttpSession session = httpServletRequest.getSession();
        User user = (User) session.getAttribute("user");
        if (user == null) {
            // 獲取到項目名,以便下面進行重定向
            String homeUrl = httpServletRequest.getContextPath();
         	// 如果是 ajax 請求,則設置 session 狀態 、CONTEXTPATH 的路徑值
         	// 如果是ajax請求響應頭會有,x-requested-with
            if (httpServletRequest.getHeader("x-requested-with") != null && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
                httpServletResponse.setHeader("SESSIONSTATUS", "TIMEOUT");
                httpServletResponse.setHeader("CONTEXTPATH", homeUrl+"/index.html");
                // FORBIDDEN,forbidden。也就是禁止、403
                httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); 
            }else{
                // 如果不是 ajax 請求,則直接跳轉即可
                httpServletResponse.sendRedirect(homeUrl+"/index.html");
            }
            return false;
        }

后記

因為以上處理,springMvc 就又可以繼續愉快的處理頁面的跳轉了;

主要是記住 ajax異步請求,前台的邏輯最后都走ajax的回調函數,只會接受后台的返回數據,不會搭理頁面跳轉這樣的要求的,因為人家畢竟只是局部刷新,而后台卻要整個頁面刷新。。


免責聲明!

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



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