easy-springboot-web-cors | 配置cors解決跨域請求問題
阿新 • • 發佈:2018-12-13
全域性配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
. maxAge(3600)
.allowCredentials(true);
}
}
使用@CrossOrigin 註解實現(可以註解方法,也可以註解類)
@CrossOrigin(origins = {"http://127.0.0.1:8020", "null"})
@PostMapping("/cors")
public String corsPost(String a) {
return a;
}
Filter實現
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); config.addAllowedOrigin("http://localhost:9000");
config.addAllowedOrigin("null");
config.addAllowedHeader("*");
config. addAllowedMethod("*");
source.registerCorsConfiguration("/**", config); // CORS 配置對所有介面都有效
FilterRegistrationBean bean = newFilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
原理
2、原理剖析
無論是通過哪種方式配置 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 規則,如果沒有配置,且是預檢請求,則拒絕該請求,如果沒有配置,且不是預檢請求,則交給負責該請求的類處理。如果配置了,則對該請求進行校驗。
校驗就是根據 CorsConfiguration 這個類的配置進行判斷:
- 判斷 origin 是否合法
- 判斷 method 是否合法
- 判斷 header是否合法
- 如果全部合法,則在 response header中新增響應的欄位,並交給負責該請求的類處理,如果不合法,則拒絕該請求。