- Spring Boot+Vue全棧開發實戰
- 王松
- 1362字
- 2020-06-30 17:14:48
4.6 CORS支持
CORS(Cross-Origin Resource Sharing)是由W3C制定的一種跨域資源共享技術標準,其目的就是為了解決前端的跨域請求。在Java EE開發中,最常見的前端跨域請求解決方案是JSONP,但是JSONP只支持GET請求,這是一個很大的缺陷,而CORS則支持多種HTTP請求方法。以CORS中的GET請求為例,當瀏覽器發起請求時,請求頭中攜帶了如下信息:

假如服務端支持CORS,則服務端給出的響應信息如下:

注意
響應頭中有一個Access-Control-Allow-Origin字段,用來記錄可以訪問該資源的域。當瀏覽器收到這樣的響應頭信息之后,提取出Access-Control-Allow-Origin字段中的值,發現該值包含當前頁面所在的域,就知道這個跨域是被允許的,因此就不再對前端的跨域請求進行限制。這就是GET請求的整個跨域流程,在這個過程中,前端請求的代碼不需要修改,主要是后端進行處理。這個流程主要是針對GET、POST以及HEAD請求,并且沒有自定義請求頭,如果用戶發起一個DELETE請求、PUT請求或者自定義了請求頭,流程就會稍微復雜一些。
以DELETE請求為例,當前端發起一個DELETE請求時,這個請求的處理會經過兩個步驟。
第一步:發送一個OPTIONS請求。代碼如下:

這個請求將向服務端詢問是否具備該資源的DELETE權限,服務端會給瀏覽器一個響應,代碼如下:

服務端給瀏覽器的響應,Allow頭信息表示服務端支持的請求方法,這個請求相當于一個探測請求,當瀏覽器分析了請求頭字段之后,知道服務端支持本次請求,則進入第二步。
第二步:發送DELETE請求。接下來瀏覽器就會發送一個跨域的DELETE請求,代碼如下:

服務端給一個響應:

至此,一個跨域的DELETE請求完成。
無論是簡單請求還是需要先進行探測的請求,前端的寫法都是不變的,額外的處理都是在服務端來完成的。在傳統的Java EE開發中,可以通過過濾器統一配置,而Spring Boot中對此則提供了更加簡潔的解決方案。在Spring Boot中配置CORS的步驟如下:
1. 創建Spring Boot工程
首先創建一個Spring Boot工程,添加Web依賴,代碼如下:

2. 創建控制器
在新創建的Spring Boot工程中,添加一個BookController控制器,代碼如下:

BookController中提供了兩個接口:一個是添加接口,另一個是刪除接口。
3. 配置跨域
跨域有兩個地方可以配置。一個是直接在相應的請求方法上加注解:

代碼解釋:
? @CrossOrigin中的value表示支持的域,這里表示來自http://localhost:8081域的請求是支持跨域的。
? maxAge表示探測請求的有效期,在前面的講解中,讀者已經了解到對于DELETE、PUT請求或者有自定義頭信息的請求,在執行過程中會先發送探測請求,探測請求不用每次都發送,可以配置一個有效期,有效期過了之后才會發送探測請求。這個屬性默認是1800秒,即30分鐘。
? allowedHeaders表示允許的請求頭,*表示所有的請求頭都被允許。
這種配置方式是一種細粒度的配置,可以控制到每一個方法上。當然,也可以不在每個方法上添加@CrossOrigin注解,而是采用一種全局配置,代碼如下:

代碼解釋:
? 全局配置需要自定義類實現WebMvcConfigurer接口,然后實現接口中的addCorsMappings方法。
? 在addCorsMappings方法中,addMapping表示對哪種格式的請求路徑進行跨域處理;allowedHeaders表示允許的請求頭,默認允許所有的請求頭信息;allowedMethods表示允許的請求方法,默認是GET、POST和HEAD;*表示支持所有的請求方法;maxAge表示探測請求的有效期;allowedOrigins表示支持的域。
在上面的兩種配置方式(@CrossOrigin注解配置和全局配置)中,選擇其中一種即可,然后啟動項目。
4. 測試
新建一個Spring Boot項目,添加Web依賴,然后在resources/static目錄下加入jquery.js,再在resources/static目錄下創建一個index.html文件,內容如下:

兩個普通的Ajax都發送了一個跨域請求。
然后將項目的端口修改為8081,代碼如下:

啟動項目,在瀏覽器中輸入“http://localhost:8081/index.html”,查看頁面,然后分別單擊兩個按鈕,查看請求結果,如圖4-24所示。

圖4-24
- Mastering Concurrency Programming with Java 8
- 零基礎搭建量化投資系統:以Python為工具
- Java異步編程實戰
- Python程序設計(第3版)
- Lua程序設計(第4版)
- 高級語言程序設計(C語言版):基于計算思維能力培養
- 零基礎Java學習筆記
- 微服務從小白到專家:Spring Cloud和Kubernetes實戰
- Java程序設計基礎(第6版)
- Arduino機器人系統設計及開發
- IPython Interactive Computing and Visualization Cookbook
- Mastering JavaScript
- Professional JavaScript
- Spring Web Services 2 Cookbook
- Python人工智能項目實戰