轉發和重定向

BLBALDMAN發表於2024-07-03

1.轉發和重定向的區別

  1. 轉發是一次請求。因此瀏覽器位址列上的地址不會發生變化。 重定向是兩次請求。因此瀏覽器位址列上的地址會發生變化。
  2. 轉發的程式碼實現:request.getRequestDispatcher("/index").forward(request, response);重定向的程式碼實現:response.sendRedirect("/webapproot/index");
  3. 轉發是伺服器內部資源跳轉,由伺服器來控制。不可實現跨域訪問。 重定向可以完成內部資源的跳轉,也可以完成跨域跳轉。
  4. 轉發的方式可以訪問WEB-INF目錄下受保護的資源。 重定向相當於瀏覽器重新傳送了一次請求,在瀏覽器直接傳送的請求是無法訪問WEB-INF目錄下受保護的資源的。
  5. 轉發原理:
    1. 假設傳送了 /a 請求,執行了 AServlet
    2. 在AServlet 中透過request.getRequestDispatcher("/b").forward(request,response);轉發到BServlet
    3. 從AServlet跳轉到BServlet是伺服器內部來控制的。對於瀏覽器而言,瀏覽器只傳送了一個 /a 請求。
  6. 重定向原理:
    1. 假設傳送了 /a 請求,執行了 AServlet
    2. 在AServlet 中透過response.sendRedirect("/webapproot/b")重定向到BServlet
    3. 此時伺服器會將請求路徑/webapproot/b響應給瀏覽器
    4. 瀏覽器會自發的再次傳送/webapproot/b請求來訪問BServlet
    5. 因此對於重定向來說,傳送了兩次請求,一次是 /webapproot/a,另一次是/webapproot/b

2.在SpringMVC中實現轉發和重定向

2.1 SpringMVC實現轉發
@Controller
public class IndexController {

    @RequestMapping("/a")
    public String toA(){
        return "forward:/b";
    }

    @RequestMapping("/b")
    public String toB(){
        return "b";
    }
}
2.2 SpringMVC實現重定向

普通重定向:

@Controller
public class IndexController {

    @RequestMapping("/a")
    public String toA(){
        return "redirect:/b";
    }

    @RequestMapping("/b")
    public String toB(){
        return "b";
    }
}

跨域重定向:

@RequestMapping("/a")
public String a(){
    return "redirect:http://localhost:8080/springmvc2/b";//全路徑
}

相關文章