Spring MVC重定向和轉發
阿新 • • 發佈:2021-08-16
Spring MVC 請求方式分為轉發、重定向 2 種,分別使用 forward 和 redirect 關鍵字在 controller 層進行處理。
重定向是將使用者從當前處理請求定向到另一個檢視(例如 JSP)或處理請求,以前的請求(request)中存放的資訊全部失效,並進入一個新的 request 作用域;轉發是將使用者對當前處理的請求轉發給另一個檢視或處理請求,以前的 request 中存放的資訊不會失效。
轉發是伺服器行為,重定向是客戶端行為。
在客戶瀏覽器的位址列中顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
客戶瀏覽器傳送 http 請求,Web 伺服器接受後傳送 302 狀態碼響應及對應新的 location 給客戶瀏覽器,客戶瀏覽器發現是 302
響應,則自動再發送一個新的 http 請求,請求 URL 是新的 location 地址,伺服器根據此請求尋找資源併發送給客戶。
在這裡 location 可以重定向到任意 URL,既然是瀏覽器重新發出了請求,那麼就沒有什麼 request 傳遞的概念了。在客戶瀏覽器的位址列中顯示的是其重定向的路徑,客戶可以觀察到地址的變化。重定向行為是瀏覽器做了至少兩次的訪問請求。
在 Spring MVC 框架中,控制器類中處理方法的 return 語句預設就是轉發實現,只不過實現的是轉發到檢視。示例程式碼如下:
在 Spring MVC 框架中,重定向與轉發的示例程式碼如下:
在 Spring MVC 框架中,不管是重定向或轉發,都需要符合檢視解析器的配置,如果直接轉發到一個不需要 DispatcherServlet 的資源,例如:
重定向是將使用者從當前處理請求定向到另一個檢視(例如 JSP)或處理請求,以前的請求(request)中存放的資訊全部失效,並進入一個新的 request 作用域;轉發是將使用者對當前處理的請求轉發給另一個檢視或處理請求,以前的 request 中存放的資訊不會失效。
轉發是伺服器行為,重定向是客戶端行為。
1)轉發過程
客戶瀏覽器傳送 http 請求,Web 伺服器接受此請求,呼叫內部的一個方法在容器內部完成請求處理和轉發動作,將目標資源傳送給客戶;在這裡轉發的路徑必須是同一個 Web 容器下的 URL,其不能轉向到其他的 Web 路徑上,中間傳遞的是自己的容器內的 request。在客戶瀏覽器的位址列中顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
2)重定向過程
在這裡 location 可以重定向到任意 URL,既然是瀏覽器重新發出了請求,那麼就沒有什麼 request 傳遞的概念了。在客戶瀏覽器的位址列中顯示的是其重定向的路徑,客戶可以觀察到地址的變化。重定向行為是瀏覽器做了至少兩次的訪問請求。
在 Spring MVC 框架中,控制器類中處理方法的 return 語句預設就是轉發實現,只不過實現的是轉發到檢視。示例程式碼如下:
@RequestMapping("/register") public String register() { return "register"; //轉發到register.jsp }
package net.biancheng.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/index") public class IndexController { @RequestMapping("/login") public String login() { //轉發到一個請求方法(同一個控制器類可以省略/index/) return "forward:/index/isLogin"; } @RequestMapping("/isLogin") public String isLogin() { //重定向到一個請求方法 return "redirect:/index/isRegister"; } @RequestMapping("/isRegister") public String isRegister() { //轉發到一個檢視 return "register"; } }
return "forward:/html/my.html";
則需要使用 mvc:resources 配置:<mvc:resources location="/html/" mapping="/html/**" />
from http://c.biancheng.net/spring_mvc/forward-redirect.html