Spring Data Rest和Cors
我正在开发一个带有Rest接口和一个飞镖的Spring Boot应用程序。
XMLHttpRequest确实执行一个OPTIONS请求,该请求的处理完全正确。此后,发出最终的GET(“ / products”)请求,但请求失败:
所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源’ http:// localhost:63343 ‘。
经过一些调试后,我发现了以下内容:除了RepositoryRestHandlerMapping之外的所有子类都填充了AbstractHandlerMapping.corsConfiguration。在RepositoryRestHandlerMapping中,在创建时没有corsConfiguration存在/设置,因此不会被识别为cors路径/资源。
=>没有附加CORS标头
可能是问题所在吗?我该如何设置?
配置类:
@Configurationpublic 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.1Host: 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 OKServer: 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 Data REST 2.6(Ingalls)之前,只有HandlerMappingSpring MVC
创建的实例WebMvcConfigurationSupport
和带有注释的控制器@CrossOrigin
才知道CORS。
但是,既然DATAREST-573已经修复,RepositoryRestConfiguration
现在可以公开getCorsRegistry()
用于全局设置,并且@CrossOrigin还可以识别存储库中的注释,因此这是推荐的方法。有关具体示例,请参见https://stackoverflow.com/a/42403956/1092077答案。
对于必须坚持使用Spring Data REST 2.5(Hopper)
或更早版本的人们,我认为最好的解决方案是使用基于过滤器的方法。你显然可以使用Tomcat,Jetty
或这一类,但要知道Spring Framework 4.2还提供了CorsFilter一种使用@CrossOrigin
与addCorsMappings(CorsRegistry registry)
方法相同的CORS处理逻辑的方法。通过将UrlBasedCorsConfigurationSource
实例传递给CorsFilter构造函数参数,你可以轻松获得与Spring本机CORS全局支持一样强大的功能。
如果你使用的是Spring Boot(支持Filter
bean),则可能是这样的:
@Configurationpublic class RestConfiguration {
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}
以上是 Spring Data Rest和Cors 的全部内容, 来源链接: utcz.com/qa/420885.html