1. 程式人生 > >重定向(Redirect)相關的幾個問題

重定向(Redirect)相關的幾個問題

此次掛接使用者中心,互動大都通過重定向(Redirect)實現。期間也遇到了一些問題,總結如下。

Redirect原理及使用

1. 重定向原理
重定向方式是在客戶端作的重定向處理。該方法通過修改HTTP協議的HEADER部分,對瀏覽器下達重定向指令的,讓瀏覽器對在location中指定的URL提出請求,使瀏覽器顯示重定向網頁的內容。
該方法可以接受絕對的或相對的URLs。如果傳遞到該方法的引數是一個相對的URL,那麼Web container在將它傳送到客戶端前會把它轉換成一個絕對的URL。

2. sendRedirect可以將頁面跳轉到任何頁面,不一定侷限於本web應用中。用法如下:

response.sendRedirect("/login.jsp");

response.sendRedirect("http://union.baidu.com");

3. 跳轉後瀏覽器位址列變化。

4. 這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。

Redirect vs Forward

1. Forward重定向是在容器內部實現的同一個Web應用程式的重定向,所以forward方法只能重定向到同一個Web應用程式中的一個資源,重定向後瀏覽器位址列URL不變,而sendRedirect方法可以重定向到任何URL,因為這種方法是修改http頭來實現的,URL沒什麼限制,重定向後瀏覽器位址列URL改變。

2. forward重定向將原始的HTTP請求物件(request)從一個servlet例項傳遞到另一個例項,而採用sendRedirect方式兩者不是同一個application。

3. 基於第二點,引數的傳遞方式不一樣。forward的form引數跟著傳遞,所以在第二個例項中可以取得HTTP請求的引數。sendRedirect只能通過連結傳遞引數,response.sendRedirect(“login.jsp?param1=a”)。

Ajax請求處理重定向

對於Ajax請求,客戶端不會處理該302的重定向請求,即頁面無響應。

當我們請求發生在伺服器session失效下,伺服器自動302到登入頁面,那我們非同步獲取的是登入頁面的資料。事實上,並沒有發生失敗事件,瀏覽器會再發一次ajax請求到302的地址,如果還是發生302,一直請求,直到完成請求或者請求跨域失敗為止。對於js來說,301 302這種跳轉是透明的,無法處理。

那到底如何當ajax正確處理302呢,這是瀏覽器級別的問題,也就是說沒有瀏覽器能正確處理302。

對於我們前端來說,正確的驗證ajax回來的資料,並給出提示,那也不友好(比如伺服器端希望我們去登入頁面)。更友好的處理是當伺服器端發生302,那ajax就當"錯誤"處理,也做302跳轉。

後一種修改方式(某產品線目前所採用的方案)即向ajax中新增對302的處理。這需要修改common.js中Ajax類,以及dwr原始碼,新增對302重定向的處理(跳轉到登陸頁)。

xml.onreadystatechange = function() {

。。。

else if(xml.status == 302 && success) {

       location.href="/××/login.jsp";

} else if

。。。

}