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