【整理】SpringBoot跨域配置填坑

【整理】SpringBoot跨域配置填坑

addCorsMappings存在的问题

通过一段时间在SpringBoot使用的摸爬滚打,发现网络上的资料通常为统一配置解决跨域问题提供了两种代码,第一种比较短,是通过创建MyWebMvcConfig类实现WebMvcConfigurer接口中的addCorsMappings方法。

具体的代码如下:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowedOriginPatterns("*")
        .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
        .allowCredentials(true)
        .maxAge(3600)
        .allowedHeaders("*");
    }
}

因为代码较短,作为新手自然也喜欢更加简洁的代码,这在项目开始阶段似乎能够解决问题。

但是后续如果添加自定义的拦截器(包括Spring security),addCorsMappings方法实现的统一跨域配置就会失效,其原因在于请求经过的先后顺序:

当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。

第二种方法,实现一个CORS拦截器

既然请求会先进入拦截器中,那么你可以尝试“以毒攻毒”,实现一个CORS拦截器:


@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行任意原始域。放行单个原始域。使用config.addAllowedOrigin("yourdomain.com")
        config.addAllowedOriginPattern("*");
        //是否发送Cookie信息
        config.setAllowCredentials(true);
        //放行哪些请求方式。放行任意请求方式可以使用:config.addAllowedMethod("*")
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        //放行任意请求头
        config.addAllowedHeader("*");

        //2.添加映射路径
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

参考链接

发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注