項目中,可能會碰到這樣的需求,前端發起http請求到服務端進行一些校驗或者登陸操作,然后根據服務端查詢結果,拼接url參數打開一個新頁面。總結了下,有三種實現方式:
1、經典的ajax請求:通過post方式,發起http請求,服務端響應頁面地址,由客戶端拼接參數,通過window.location方式打開新頁面。也可以由服務端直接把參數拼接好,返回一個完整的url地址由客戶端通過JS跳轉,
2、通過服務端302跳轉,這涉及兩個概念:redirect(重定向)、forward(轉發)
2.1 重定向:重定向是客戶端行為,
重定向過程:客戶端發送http請求 ---> web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器 ---> 客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址 ---> 服務器根據此請求尋找資源並發送給客戶,這里為瀏覽器行為
實現示意圖:
實現思路:服務端302返給客戶端時,會攜帶一個新的location給客戶端,客戶端需要監聽302狀態,通過location打開新頁面
if (data.status == 302) { location.href = data.location; }
2.2、服務端轉發:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源發送給客戶;轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
轉發示意圖:
注意事項:要做服務器轉發,必須得經過a標簽或者location觸發請求,服務器才可以302轉發資源並打開新頁面
2.3、兩個對比列表
類別 | 概念 | 共享數據 | 應用 |
Redirect | URL重新定向:可以是任意的URL | 不能共享request里面的數據 | 一般用於用戶注銷登錄時返回主頁面和跳轉到其它的網站等等 |
Forward | 頁面的轉發:只能是同一個Web應用程序的其他Web組件 | 轉發頁面和轉發到的頁面可以共性request里面的數據 | 一般用於用戶登錄的時候根據角色轉發到相應的模塊等等 |
2.4、有個例子說明兩者的區別很生動:
假設你去辦理某個執照
重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。
轉發:你先去了A局,A局看了以后,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯系了B的人,讓他們辦好后,送了過來。