偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringBoot 項(xiàng)目處理跨域的四種技巧

開發(fā) 前端
CORS?是一個(gè)?W3C?標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin ?resource ?sharing), 它需要瀏覽器和服務(wù)器同時(shí)支持他,允許瀏覽器向跨源服務(wù)器發(fā)送XMLHttpRequest請(qǐng)求,從而克服 AJAX 只能同源使用的限制。

上周幫一家公司優(yōu)化代碼時(shí),順手把跨域的問(wèn)題解決了, 這篇文章,我們聊聊 SpringBoot 項(xiàng)目處理跨域的四種技巧 。

圖片圖片

一、什么是跨域

我們先看下一個(gè)典型的網(wǎng)站的地址:

圖片圖片

同源是指:協(xié)議、域名、端口號(hào)完全相同。

下表給出了與 URL http://www.training.com/dir/page.html 的源進(jìn)行對(duì)比的示例 :

圖片圖片

當(dāng)用戶通過(guò)瀏覽器訪問(wèn)應(yīng)用(http://admin.training.com)時(shí),調(diào)用接口的域名非同源域名(http://api.training.com),這是顯而易見的跨域場(chǎng)景。

二、理解 CORS

CORS 是一個(gè) W3C 標(biāo)準(zhǔn),全稱是"跨域資源共享"(Cross-origin  resource  sharing), 它需要瀏覽器和服務(wù)器同時(shí)支持他,允許瀏覽器向跨源服務(wù)器發(fā)送XMLHttpRequest請(qǐng)求,從而克服 AJAX 只能同源使用的限制。

跨域資源共享標(biāo)準(zhǔn)新增了一組 HTTP 首部字段,允許服務(wù)器聲明哪些源站通過(guò)瀏覽器有權(quán)限訪問(wèn)哪些資源。

規(guī)范要求,對(duì)那些可能對(duì)服務(wù)器數(shù)據(jù)產(chǎn)生副作用的 HTTP 請(qǐng)求方法(特別是 GET 以外的 HTTP 請(qǐng)求,或者搭配某些 MIME 類型的 POST 請(qǐng)求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個(gè)預(yù)檢請(qǐng)求(preflight request),從而獲知服務(wù)端是否允許該跨域請(qǐng)求。

服務(wù)器確認(rèn)允許之后,才發(fā)起實(shí)際的 HTTP 請(qǐng)求。在預(yù)檢請(qǐng)求的返回中,服務(wù)器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))。

圖片圖片

1.簡(jiǎn)單請(qǐng)求

簡(jiǎn)單請(qǐng)求模式,瀏覽器直接發(fā)送跨域請(qǐng)求,并在請(qǐng)求頭中攜帶 Origin 的頭,表明這是一個(gè)跨域的請(qǐng)求。 服務(wù)器端接到請(qǐng)求后,會(huì)根據(jù)自己的跨域規(guī)則,通過(guò) Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 響應(yīng)頭,來(lái)返回驗(yàn)證結(jié)果。

圖片圖片

2.預(yù)檢請(qǐng)求

瀏覽器在發(fā)現(xiàn)頁(yè)面發(fā)出的請(qǐng)求非簡(jiǎn)單請(qǐng)求,并不會(huì)立即執(zhí)行對(duì)應(yīng)的請(qǐng)求代碼,而是會(huì)觸發(fā)預(yù)先請(qǐng)求模式。預(yù)先請(qǐng)求模式會(huì)先發(fā)送preflight request(預(yù)先驗(yàn)證請(qǐng)求),preflight request是一個(gè) OPTION 請(qǐng)求,用于詢問(wèn)要被跨域訪問(wèn)的服務(wù)器,是否允許當(dāng)前域名下的頁(yè)面發(fā)送跨域的請(qǐng)求。在得到服務(wù)器的跨域授權(quán)后才能發(fā)送真正的 HTTP 請(qǐng)求。

圖片圖片

三、Nginx 配置

圖片圖片

我們不用配置 SpringBoot 項(xiàng)目,在反向代理層 Nginx 直接配置 CORS ,典型配置如下圖:

圖片圖片

四、配置類實(shí)現(xiàn) addCorsMapping 接口

SpringBoot 中新增一個(gè)配置類 CorsConfig.java,繼承 WebMvcConfigurerAdapter 或者實(shí)現(xiàn)WebMvcConfigurer 接口,項(xiàng)目啟動(dòng)后,會(huì)自動(dòng)讀取配置。

圖片圖片

五、CorsFilter 過(guò)濾器模式

下圖是 SpringMvc 模式里,過(guò)濾器,攔截器,控制器的執(zhí)行順序。

圖片圖片

CorsFilter 過(guò)濾器模式的優(yōu)點(diǎn)是:優(yōu)先級(jí)高,可以規(guī)避代碼中業(yè)務(wù)攔截器異常導(dǎo)致 adCorsMappings 方法失效的問(wèn)題。

我們需要定義一個(gè) corsFilter 方法,@Bean 注解表示此方法返回一個(gè)Spring Bean,該 Bean 將由Spring 容器管理。

corsFilter() 方法定義了一個(gè) FilterRegistrationBean,這個(gè) bean 是用來(lái)注冊(cè) CorsFilter 的,后者用于處理 CORS 請(qǐng)求。

圖片圖片

六、網(wǎng)關(guān)模式

在微服務(wù)架構(gòu)體系中,網(wǎng)關(guān)是非常核心的組件。 API 網(wǎng)關(guān)可以做鑒權(quán),限流,灰度等,同時(shí)可以配置 CORS 。內(nèi)部服務(wù)端不用特別關(guān)注跨域這個(gè)問(wèn)題。

圖片圖片

因此假如是 SpringCloud 體系,我們只需要配置 SpringCloud gateway 的跨域即可。

責(zé)任編輯:武曉燕 來(lái)源: 勇哥Java實(shí)戰(zhàn)
相關(guān)推薦

2025-01-15 12:43:23

2024-05-22 19:10:18

跨域Web開發(fā)

2010-07-28 22:35:25

ADSL掉線

2017-02-28 14:28:37

數(shù)據(jù)跨庫(kù)分頁(yè)架構(gòu)

2025-06-12 03:55:00

項(xiàng)目處理異常代碼

2022-10-09 18:16:01

Flowable設(shè)置ReceiveTas

2020-08-10 00:30:55

備份密碼iPhone移動(dòng)安全

2024-12-02 14:30:20

2017-09-01 11:59:59

Android

2021-02-21 21:20:24

SpringBoot異步網(wǎng)絡(luò)

2019-10-24 07:42:28

Java引用GC

2017-07-06 15:40:19

DevOps核心能力

2012-09-11 09:55:26

編程HTML5編程能力

2011-03-16 09:05:53

NATiptables

2021-10-24 08:37:18

網(wǎng)絡(luò)監(jiān)控網(wǎng)絡(luò)架構(gòu)網(wǎng)絡(luò)

2023-08-10 11:39:54

RabbitMQSpring交換機(jī)

2011-11-24 16:34:39

Java

2025-01-15 08:42:41

2020-05-19 20:13:04

物聯(lián)網(wǎng)計(jì)算類型IOT

2021-06-04 10:45:31

軟件架構(gòu)分布式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)