为什么在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 变化:原始 变化:访问控制请求方法 变化:访问控制请求标题
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) ; } }