layout: post
title: 轉發與重定向的區別
date: 2020-02-06
author: xiepl1997
tags: javahtml
一直沒有搞懂轉發和重定向的概念,更別提區別了。今天在上面栽跟頭,特查資料總結以下。java
形式:request.getRequestDispatcher().forward(request,response)
在springboot中的controller進行試圖解析時默認轉發。
轉發在服務器端發揮做用,經過forward()方法提交信息在多個頁面之間進行傳遞。能夠理解爲服務器跳轉,至關於方法調用,在執行當前文件的過程當中轉向執行目標文件,兩個文件(當前文件和目標文件)屬於同一次請求,先後頁共用一個request,能夠經過此來傳遞一些數據或者session信息。web
1.客戶端瀏覽器發送http
2.web瀏覽器接受請求
3.調用內部的一個方法在容器內部完成請求處理和轉發動做spring
須要注意的是:轉發路徑必須是同一個web容器下的url。在客戶端瀏覽器路徑顯示的仍然是第一次訪問的路徑。轉發行爲是瀏覽器只作了一次訪問請求。瀏覽器
形式:response.sendRedirect("");
springboot中進行重定向時,controller中寫springboot
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中資源。
重定向也是客戶端跳轉,至關於客戶端向服務器發送請求後,服務器返回一個響應,客戶端接收到響應以後又向服務器端發送一次請求,一共是2次請求,先後頁不共用一個request,不能讀取轉向前經過request.setAttribute()設置的屬性值。session
1.客戶端發送http請求
2.web服務器接收後,發送302狀態碼,以及新的location給客戶端瀏覽器
3.客戶端瀏覽器發現是302響應,則自動發送一個http請求,請求url爲重定向的地址,相應的服務器根據此請求尋找資源併發送給客戶。併發