1. 程式人生 > 其它 >Spring MVC重定向和轉發

Spring MVC重定向和轉發

Spring MVC 請求方式分為轉發、重定向 2 種,分別使用 forward 和 redirect 關鍵字在 controller 層進行處理。

重定向是將使用者從當前處理請求定向到另一個檢視(例如 JSP)或處理請求,以前的請求(request)中存放的資訊全部失效,並進入一個新的 request 作用域;轉發是將使用者對當前處理的請求轉發給另一個檢視或處理請求,以前的 request 中存放的資訊不會失效。

轉發是伺服器行為,重定向是客戶端行為。

1)轉發過程

客戶瀏覽器傳送 http 請求,Web 伺服器接受此請求,呼叫內部的一個方法在容器內部完成請求處理和轉發動作,將目標資源傳送給客戶;在這裡轉發的路徑必須是同一個 Web 容器下的 URL,其不能轉向到其他的 Web 路徑上,中間傳遞的是自己的容器內的 request。

在客戶瀏覽器的位址列中顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

2)重定向過程

客戶瀏覽器傳送 http 請求,Web 伺服器接受後傳送 302 狀態碼響應及對應新的 location 給客戶瀏覽器,客戶瀏覽器發現是 302 響應,則自動再發送一個新的 http 請求,請求 URL 是新的 location 地址,伺服器根據此請求尋找資源併發送給客戶。

在這裡 location 可以重定向到任意 URL,既然是瀏覽器重新發出了請求,那麼就沒有什麼 request 傳遞的概念了。在客戶瀏覽器的位址列中顯示的是其重定向的路徑,客戶可以觀察到地址的變化。重定向行為是瀏覽器做了至少兩次的訪問請求。

在 Spring MVC 框架中,控制器類中處理方法的 return 語句預設就是轉發實現,只不過實現的是轉發到檢視。示例程式碼如下:
@RequestMapping("/register")
public String register() {
    return "register";  //轉發到register.jsp
}
在 Spring MVC 框架中,重定向與轉發的示例程式碼如下:
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";
    }
}
在 Spring MVC 框架中,不管是重定向或轉發,都需要符合檢視解析器的配置,如果直接轉發到一個不需要 DispatcherServlet 的資源,例如:

return "forward:/html/my.html";

則需要使用 mvc:resources 配置:

<mvc:resources location="/html/" mapping="/html/**" />

from http://c.biancheng.net/spring_mvc/forward-redirect.html