Spring Data Rest和Cors

Spring Data Rest和Cors

我正在开发一个带有Rest接口和dart前端的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:8080Connection: keep-aliveCache-Control: max-age=0authorization: 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.36Content-Type: application/jsonAccept: */*
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.1Content-Type: application/hal+json;charset=UTF-8Transfer-Encoding: chunkedDate: Thu, 30 Jul 2015 15:58:03 GMT

使用的版本:Spring Boot 1.3.0.M2 Spring 4.2.0.RC2

我错过了什么?


小唯快跑啊
浏览 733回答 3
3回答

蓝山帝景

实际上,在Spring Data REST 2.6(Ingalls)之前,只有HandlerMappingSpring MVC创建的实例WebMvcConfigurationSupport和带注释的控制器才能@CrossOrigin识别CORS。但是现在已经修复了DATAREST-573,RepositoryRestConfiguration现在公开了一个getCorsRegistry()全局设置,并且@CrossOrigin还可以识别存储库上的注释,因此这是推荐的方法。对于必须坚持使用Spring Data REST 2.5(Hopper)或以前版本的人,我认为最好的解决方案是使用基于过滤器的方法。显然你可以使用Tomcat,Jetty或者这个,但要注意Spring Framework 4.2还提供了一个CorsFilter使用相同@CrossOrigin和addCorsMappings(CorsRegistry registry)接近的CORS处理逻辑的方法。通过将UrlBasedCorsConfigurationSource实例传递给CorsFilter构造函数参数,您可以轻松获得与Spring本机CORS全局支持一样强大的功能。如果您使用的是Spring Boot(支持Filterbean),它可能是这样的:@Configurationpublic&nbsp;class&nbsp;RestConfiguration&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Bean &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FilterRegistrationBean&nbsp;corsFilter()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UrlBasedCorsConfigurationSource&nbsp;source&nbsp;=&nbsp;new&nbsp;UrlBasedCorsConfigurationSource(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CorsConfiguration&nbsp;config&nbsp;=&nbsp;new&nbsp;CorsConfiguration().applyPermitDefaultValues(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source.registerCorsConfiguration("/**",&nbsp;config); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterRegistrationBean&nbsp;bean&nbsp;=&nbsp;new&nbsp;FilterRegistrationBean(new&nbsp;CorsFilter(source)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setOrder(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bean; &nbsp;&nbsp;&nbsp;&nbsp;}}

ITMISS

自从Ingalls列车实现以来,现在开始在Spring Data中支持CORS。有两种方法可以解决:@CrossOrigin带有指定origins,methods和allowedHeaders通过@RepositoryRestResource接口的注释。@CrossOrigin(...)@RepositoryRestResourcepublic&nbsp;interface&nbsp;PageRepository&nbsp;extends&nbsp;CrudRepository<Page,&nbsp;Long>&nbsp;{&nbsp;...&nbsp;}具有RepositoryRestConfiguration内部@Configuration类的全局配置。@CrossOrigin因此不需要标记存储库。@Configurationpublic&nbsp;class&nbsp;GlobalRepositoryRestConfigurer&nbsp;extends&nbsp;RepositoryRestConfigurerAdapter&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;configureRepositoryRestConfiguration(RepositoryRestConfiguration&nbsp;config)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.getCorsRegistry() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addMapping(CORS_BASE_PATTERN) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowedOrigins(ALLOWED_ORIGINS) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowedHeaders(ALLOWED_HEADERS) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowedMethods(ALLOWED_METHODS); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP