轉發與重定向的區別(jekyll遷移)

layout: post
title: 轉發與重定向的區別
date: 2020-02-06
author: xiepl1997
tags: javahtml

一直沒有搞懂轉發和重定向的概念,更別提區別了。今天在上面栽跟頭,特查資料總結以下。java

轉發(服務端行爲)

形式:request.getRequestDispatcher().forward(request,response)
在springboot中的controller進行試圖解析時默認轉發。
轉發在服務器端發揮做用,經過forward()方法提交信息在多個頁面之間進行傳遞。能夠理解爲服務器跳轉,至關於方法調用,在執行當前文件的過程當中轉向執行目標文件,兩個文件(當前文件和目標文件)屬於同一次請求,先後頁共用一個request,能夠經過此來傳遞一些數據或者session信息。web

  • 地址欄不會變
  • 轉發只能轉發到當前web應用內的資源
  • 在轉發過程當中,能夠將數據保存到request域對象中去
  • 轉發只有一次請求
    轉發是服務器端行爲

轉發過程

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

  • 重定向地址欄會改變
  • 重定向能夠跳轉到當前web應用,甚至是外部域名網站
  • 不能在重定向過程當中,將數據保存到request域對象中

重定向過程

1.客戶端發送http請求
2.web服務器接收後,發送302狀態碼,以及新的location給客戶端瀏覽器
3.客戶端瀏覽器發現是302響應,則自動發送一個http請求,請求url爲重定向的地址,相應的服務器根據此請求尋找資源併發送給客戶。併發

相關文章
相關標籤/搜索