1. 程式人生 > >非同步請求無法重定向的原因

非同步請求無法重定向的原因

轉自:https://blog.csdn.net/maoyuliang/article/details/78851439

以前寫response.sendRedirect("/login.jsp");是成功的

今天用到ajax請求,傳送給後臺,希望遇到錯誤了  直接跳轉,發現無效

首先要深入瞭解ajax請求和response.sendRedirect的機制

response.sendRedirect的機制

首先我們要明白用response.sendRedirect做轉向的原理,它其實是向瀏覽器傳送一個特殊的Header,然後由瀏覽器來做轉向,轉到指定的頁面,所以用sendRedirect時,瀏覽器的位址列上可以看到地址的變化。
用<jsp:forward page=""/>則不同,它是直接在server做的,瀏覽器並不知道,也不和瀏覽器打交道,這從瀏覽器的地址並不變化可以看出。
所以使用response.sendRedirect時就需要注意以下兩點:
1,在使用response.sendRedirect時,前面不能有HTML輸出。
這並不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了瀏覽器。事實上現在的server都有cache機制,一般在8K(我是說JSP SERVER),這就意味著,除非你關閉了cache,或者你使用了out.flush()強制重新整理,那麼在使用sendRedirect之前,有少量的HTML輸出也是允許的。
如果報錯說,“一些資訊已經被submitted”(原文忘了),那麼,你就要注意看了,前面是不是有過多的HTML輸出了。
2,在response.sendRedirect之後,應該緊跟一句return;
我們已經知道response.sendRedirect是通過瀏覽器來做轉向的,所以只有在頁面處理完成後,才會有實際的動作。既然你已經要做轉向了,那麼後的輸出還有什麼意義呢?而且有可能會因為後面的輸出導致轉向失敗。

ajax請求

 Ajax的原理簡單來說,實際上就是通過XmlHttpRequest物件來向伺服器發非同步請求,從伺服器獲得資料,然後用javascript來操作DOM而更新頁面。 
這其中最關鍵的一步就是從伺服器獲得請求資料。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所瞭解。 
    我們可以看出,XMLHttpRequest物件完全用來向伺服器發出一個請求的,它的作用也侷限於此,但它的作用是整個ajax實現的關鍵,我們可以把伺服器端看成一個數據介面,它返回的是一個純文字流,當然,這個文字流可以是XML格式,可以是Html,可以是Javascript程式碼,也可以只是一個字串。這時候,XMLHttpRequest向伺服器端請求這個頁面,伺服器端將文字的結果寫入頁面,這和普通的web開發流程是一樣的,不同的是,客戶端在非同步獲取這個結果後,不是直接顯示在頁面,而是先由javascript來處理,然後再顯示在頁面。

所以

由於請求都是採用Ajax的, 所以每次發起ajax請求, 雖然攔截器判斷出未登入跳轉到登入頁面, 那麼, 這次ajax請求的結果就是這個頁面(具體的說, 這次請求返回的就是登入頁面的原始碼), 所以瀏覽器不會發生跳轉. 通過在請求完成事件處理函式中判斷返回的文字是不是登入頁面的原始碼(比如檢查返回值中是否包含<title>使用者登入</title>, 這個和登入頁面有關了), 如果包含, 則top.location.href='登入頁面的url'