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?注解 :
- 2、如果想對一系列接口添加 CORS 配置,可以在類上添加注解,對該類聲明所有接口都有效:
- 3、如果想添加全局配置,則需要添加一個配置類 :
另外,還可以通過添加 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?處理過程如下:
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--跨域资源共享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019 Multi-Universit
- 下一篇: step3 . day3 数据结构之线性