1. 程式人生 > >easy-springboot-web-cors | 配置cors解決跨域請求問題

easy-springboot-web-cors | 配置cors解決跨域請求問題

全域性配置

@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中新增響應的欄位,並交給負責該請求的類處理,如果不合法,則拒絕該請求。