【发布时间】:2015-10-21 21:11:17
【问题描述】:
我正在开发一个带有 Rest 接口和 dart 前端的 Spring Boot 应用程序。
XMLHttpRequest 确实执行了一个处理完全正确的 OPTIONS 请求。在此之后,发出最终的 GET ("/products") 请求并失败:
请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:63343' 因此不允许访问。
经过一些调试,我发现以下内容:
AbstractHandlerMapping.corsConfiguration 为除 RepositoryRestHandlerMapping 之外的所有子类填充。在 RepositoryRestHandlerMapping 中,没有 corsConfiguration 在创建时存在/设置,因此它不会被识别为 cors 路径/资源。
=> 没有附加 CORS 标头
这可能是问题吗?我该如何设置?
配置类:
@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(false).allowedOrigins("*").allowedMethods("PUT", "POST", "GET", "OPTIONS", "DELETE").exposedHeaders("Authorization", "Content-Type");
}
...
}
我什至尝试为每个注释设置 Cors:
@CrossOrigin( methods = RequestMethod.GET, allowCredentials = "false")
public interface ProductRepository extends CrudRepository<Product, String> {
}
原始请求标头:
GET /products HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36
Content-Type: application/json
Accept: */*
Referer: http://localhost:63343/inventory-web/web/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
原始响应标头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 30 Jul 2015 15:58:03 GMT
使用的版本: Spring Boot 1.3.0.M2 Spring 4.2.0.RC2
我错过了什么?
【问题讨论】:
-
我不知道 Spring Boot,但我已经使用 Java 端的过滤器和 Dart 端的一些额外参数完成了它,请参阅 dart:stackoverflow.com/questions/29427203/… 和 stackoverflow.com/questions/22846309/… 也发布一些网络跟踪,它可以更容易地查看实际发送和接收的内容。
-
过滤器应该不再需要恕我直言:stackoverflow.com/a/31539691/1309964 - 对于 OPTIONS 请求,这已经有效。
-
听起来不错的新注释可以使用!查看您的响应标头,我希望看到以下我不是的标头:
Access-Control-Allow-Credentials:true/false.Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETEAccess-Control-Allow-Origin:http://____.comAccess-Control-Max-Age:60我假设 Spring Boot 自动处理注释扫描或者您手动设置它?我假设这些注释位于某种控制器中,您是否有一个 @Controller 注释或一些告诉 spring 扫描该类的注释? -
像这个例子一样,如果你把它直接放在你上面
@Controller/@RestController是否有效? spring.io/blog/2015/06/08/cors-support-in-spring-framework -
这个提交应该可以解决问题:DATAREST-573 - Add support for new CORS configuration mechanisms intr…,它将包含在 2.6 版中
标签: java spring spring-mvc cors spring-data-rest