日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CORS--跨域资源共享

發布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CORS--跨域资源共享 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CORS?是一個?W3C?標準,全稱是”跨域資源共享”(Cross-origin resource sharing)。它允許瀏覽器向跨源服務器,發出?XMLHttpRequest?請求,從而克服了?AJAX?只能同源使用的限制。但同時也會帶來安全的隱患,其中最主要的隱患來自于CSRF(Cross-site request forgery)跨站請求偽造。

1、瀏覽器的同源策略

瀏覽器將?CORS?請求分成了簡單請求和非簡單請求

簡單請求條件如下,不滿足則為非簡單請求。對于非簡單請求的跨源請求,瀏覽器會在真實請求發出前,增加一次OPTION請求,稱為預檢請求(preflight request)。預檢請求將真實請求的信息,包括請求方法、自定義頭字段、源信息添加到 HTTP 頭信息字段中,詢問服務器是否允許這樣的操作。

2、CORS配置

  • 1、如果想要對某一接口配置?CORS,可以在方法上添加?@CrossOrigin?注解 :
@CrossOrigin(origins = {"http://localhost:9000", "null"}) @RequestMapping(value = "/test", method = RequestMethod.GET) public String greetings() {return "{\"project\":\"just a test\"}"; }
  • 2、如果想對一系列接口添加 CORS 配置,可以在類上添加注解,對該類聲明所有接口都有效:
@CrossOrigin(origins = {"http://localhost:9000", "null"}) @RestController @SpringBootApplication public class SpringBootCorsTestApplication {}
  • 3、如果想添加全局配置,則需要添加一個配置類 :
@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 跨域設置registry.addMapping("/**").allowedOrigins("*");}};}

另外,還可以通過添加 Filter 的方式,配置 CORS 規則,并手動指定對哪些接口有效。

@Bean public FilterRegistrationBean corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);
config.addAllowedOrigin("*");source.registerCorsConfiguration("/**", config); // CORS 配置對所有接口都有效FilterRegistrationBean bean = newFilterRegistrationBean(new CorsFilter(source));bean.setOrder(0);return bean; }

3、原理解析

無論是通過哪種方式配置?CORS,其實都是在構造?CorsConfiguration。 一個?CORS?配置用一個?CorsConfiguration類來表示,它的定義如下:

public class CorsConfiguration { private List<String> allowedOrigins; private List<String> allowedMethods; private List<String> allowedHeaders; private List<String> exposedHeaders; private Boolean allowCredentials; private Long maxAge; }

Spring?中對?CORS?規則的校驗,都是通過委托給?DefaultCorsProcessor實現的。

DefaultCorsProcessor?處理過程如下:

  • 判斷依據是?Header中是否包含?Origin。如果包含則說明為?CORS請求,轉到 2;否則,說明不是?CORS?請求,不作任何處理。
  • 判斷?response?的?Header?是否已經包含?Access-Control-Allow-Origin,如果包含,證明已經被處理過了, 轉到 3,否則不再處理。
  • 判斷是否同源,如果是則轉交給負責該請求的類處理
  • 是否配置了?CORS?規則,如果沒有配置,且是預檢請求,則拒絕該請求,如果沒有配置,且不是預檢請求,則交給負責該請求的類處理。如果配置了,則對該請求進行校驗。
  • 4、配置項解析

    1 Access-Control-Allow-Origin
    該字段必填。它的值要么是請求時Origin字段的具體值,要么是一個*,表示接受任意域名的請求。

    2 Access-Control-Allow-Methods
    該字段非簡單請求時必填。它的值是逗號分隔的一個具體的字符串或者*,表明服務器支持的所有跨域請求的方法。注意,返回的是所有支持的方法,而不單是瀏覽器請求的那個方法。這是為了避免多次"預檢"請求。

    3 Access-Control-Expose-Headers
    4.3 該字段可選。CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在Access-Control-Expose-Headers里面指定。

    4 Access-Control-Allow-Credentials
    該字段可選。它的值是一個布爾值,表示是否允許發送Cookie.默認情況下,不發生Cookie,即:false。對服務器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json,這個值只能設為true。如果服務器不要瀏覽器發送Cookie,刪除該字段即可。

    5 Access-Control-Max-Age
    該字段可選,用來指定本次預檢請求的有效期,單位為秒。在有效期間,不用發出另一條預檢請求。?

    ?

    轉載于:https://www.cnblogs.com/pjfmeng/p/11233295.html

    總結

    以上是生活随笔為你收集整理的CORS--跨域资源共享的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。