文章目錄
前言
本文着重解決前后端分離開發的頁面調整問題。
筆者,在做一個需求,需要對訪問網站,但是沒有登錄的用戶進行攔截,將他們重定向到首頁。
很簡單的一個需求,使用 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
的回調函數,只會接受后台的返回數據,不會搭理頁面跳轉這樣的要求的,因為人家畢竟只是局部刷新,而后台卻要整個頁面刷新。。