小编典典

迁移到Spring Boot 2.0.x时,全局CORS配置中断

spring-boot

为什么在Spring Boot
2.0.x(我的情况是2.0.1RELEASE)下,不再响应预检调用(OPTIONS)而发送“访问控制允许凭据”?这是我的Global
CORS配置,在Spring Boot 1.5.6下可以正常工作:

@Configuration
public class CorsConfig {

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins(
                        "http://localhost:3000",..)
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD");
        }
    };
}}

我的pom依赖项(我正在做自己的安全性并避免使用Spring Security):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

我对REST端点的服务调用使预检失败:

无法加载http:// localhost:8080 / api / v5 / sec /
auth
:对预检请求的响应未通过访问控制检查:响应中“ Access-
Control-Allow-Credentials”标头的值为“ ‘,当请求的凭据模式为’include’时必须为’true’。因此,不允许访问源’
http:// localhost:3000 ‘。

我已经验证了在Spring Boot 1.5.6的情况下确实存在“ Access-Control-Allow-Credentials”标头,而在Spring
Boot 2.0.1下却不存在。

所有的文件,我可以找到,包括spring.io最新这里,说我的全局配置仍然是正确的,即使WebMvcConfigurerAdapter现在似乎被弃用。


更新:


以下是迁移前后的响应标头:

迁移之前(Spring Boot 1.5.6):

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://
localhost:3000

内容类型:application / json; charset = UTF-
8日期:Day,dd周一yyyy hh:mm:ss GMT
传输编码:分块
变化:来源

迁移后(Spring Boot 2.0.1-缺少Access-Control-Allow-Credentials标头,但其他值已更改/添加):

Access-Control-Allow-Headers:内容类型
Access-Control-Allow-Methods:GET,HEAD,POST < -我指定的方法被忽略
Access-Control-Allow-Origin: _< -我指定的源被忽略*_
Access-Control -Max-Age:1800
Content-Length:0日期
:Day,dd Mon yyyy hh:mm:ss GMT
变化:原始
变化:访问控制请求方法
变化:访问控制请求标题


阅读 318

收藏
2020-05-30

共1个答案

小编典典

Spring文档和许多示例都缺少此功能,但是答案非常简单。我刚刚在CorsRegistry上看到了allowCredentials()方法,并向注册表方法链中添加了.allowCredentials(true),并重新添加了Access-
Control-Allow-Credentials标头。

另外,我不再使用不推荐使用的WebMvcConfigurerAdapter,而是现在实现WebMvcConfigurer并重写addCorsMappings()方法。

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")
                .allowedOrigins(
                        "http://localhost:3000",..)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                .allowCredentials(true)
        ;
    }

}
2020-05-30