轉發和重定向的過程和區別

有頭髮的程式碼匠發表於2019-10-21

轉發  req.getRequestDispatcher("/要跳轉的地址").forward(req, resp);

轉發的過程:(以servlet和jsp為例)

瀏覽器首先傳送一個請求到伺服器端,伺服器端發現匹配的 servlet,並指定它去執行,當這個 servlet 執行完之後,它要呼叫getRequestDispacther()方法,把請求轉發給指定的jsp頁面,整個流程都是在伺服器端完成的,而且是在同一個請求裡面完成的,因此 servlet 和 jsp 共享的是同一個request,在 servlet 裡面存放的所有東西,在jsp頁面中都能取出來。整個過程是一個請求,一個響應。

易錯點:

a)位址列不會改變

b)轉發只能轉發到當前web應用內的資源

c)在轉發過程中,可以把資料儲存到request域物件中(因為轉發使用同一個request域)

d)轉發是在伺服器端的跳轉,瀏覽器並不知情

 

重定向  resp.sendRedirect("/要跳轉的地址");

重定向的過程:(以servlet和jsp為例)

瀏覽器傳送一個請求到伺服器端,伺服器端匹配servlet,這都和請求轉發一樣,servlet 處理完之後呼叫了sendRedirect()這個方法,這個方法是response的方法,所以當這個servlet處理完之後,看到response.senRedirect()方法,立即向瀏覽器返回這個響應(包含響應報頭和新的URL地址),響應告訴瀏覽器你必須要再傳送一個請求,去訪問 jsp頁面,緊接著瀏覽器收到這個請求後,立刻又重新發出一個新的請求,去請求 jsp頁面。這兩個請求互不干擾,相互獨立,在前面request裡面 setAttribute() 的任何東西,在後面的request裡面都獲取不了。可見,在重定向裡面是兩個請求,兩個響應。

易錯點:

a)位址列會改變,變成重定向後的地址

b)重定向可以跳轉到當前web應用或其他web應用,甚至是外部域名網站

c)不能在重定向的過程中,把資料儲存到request中(因為傳送第二個request請求時,第一個的request域會失效)

d) 重定向是在瀏覽器的跳轉,瀏覽器知情

 

轉發和重定向的區別:

轉發是在伺服器端的跳轉,就是瀏覽器向伺服器傳送一個請求,伺服器直接將請求相關的引數的資訊原封不動的傳遞到該伺服器的其他jsp或servlet去處理。而重定向是在瀏覽器的跳轉,伺服器會返回給瀏覽器一個響應報頭和新的URL地址,原來的引數或者其他的一些資訊,如果伺服器端沒有特別處理就不存在了,瀏覽器會訪問新的URL所指向的servlet 或 jsp。

 

注意點如果要使用request域物件進行資料共享,只能使用轉發!!!

相關文章