一直沒有搞懂轉發和重定向的概念,更別提區別了。今天在上面栽跟頭,特查資料總結如下。
轉發(服務端行爲)
形式:request.getRequestDispatcher().forward(request,response)
在springboot中的controller進行試圖解析時默認轉發。
轉發在服務器端發揮作用,通過forward()方法提交信息在多個頁面之間進行傳遞。
- 地址欄不會變
- 轉發只能轉發到當前web應用內的資源
- 在轉發過程中,可以將數據保存到request域對象中去
- 轉發只有一次請求
轉發是服務器端行爲
轉發過程
1.客戶端瀏覽器發送http
2.web瀏覽器接受請求
3.調用內部的一個方法在容器內部完成請求處理和轉發動作
需要注意的是:轉發路徑必須是同一個web容器下的url。在客戶端瀏覽器路徑顯示的仍然是第一次訪問的路徑。轉發行爲是瀏覽器只做了一次訪問請求。
重定向(客戶端行爲)
形式:response.sendRedirect("");
springboot中進行重定向時,controller中寫
mv.setViewName("redirect:/main.html");
return mv;
隨後使用WebMvcConfigurer擴展SpringMVC
@Configuration
public class ViewControllerimpl implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//將templates中的StudentPage.html映射到路徑urlpath爲“/main.html”上
registry.addViewController("/main.html").setViewName("StudentPage");
}
}
如果controller中直接寫mv.setViewName("redirect:StudentPage")
的話,將會出現404(若StudentPage.html存放在templates文件夾中)。這是因爲templates不是springboot項目的靜態資源地址,重定向是二次請求,所以無法訪問templates中資源。
- 重定向地址欄會改變
- 重定向可以跳轉到當前web應用,甚至是外部域名網站
- 不能在重定向過程中,將數據保存到request域對象中
重定向過程
1.客戶端發送http請求
2.web服務器接收後,發送302狀態碼,以及新的location給客戶端瀏覽器
3.客戶端瀏覽器發現是302響應,則自動發送一個http請求,請求url爲重定向的地址,相應的服務器根據此請求尋找資源併發送給客戶。