轉載自:http://hi.baidu.com/fboosjgvuvckore/item/405a1cd7be2c36e3795daa8b
此次掛接用戶中心,交互大都通過重定向(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
。。。
}