为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Data Rest和Cors

Spring Data Rest和Cors

小唯快跑啊 2019-08-12 16:48:45
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我错过了什么?
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

实际上,在Spring Data REST 2.6(Ingalls)之前,只有HandlerMappingSpring MVC创建的实例WebMvcConfigurationSupport和带注释的控制器才能@CrossOrigin识别CORS。

但是现在已经修复了DATAREST-573RepositoryRestConfiguration现在公开了一个getCorsRegistry()全局设置,并且@CrossOrigin还可以识别存储库上的注释,因此这是推荐的方法。

对于必须坚持使用Spring Data REST 2.5(Hopper)或以前版本的人,我认为最好的解决方案是使用基于过滤器的方法。显然你可以使用Tomcat,Jetty或者这个,但要注意Spring Framework 4.2还提供了一个CorsFilter使用相同@CrossOriginaddCorsMappings(CorsRegistry registry)接近的CORS处理逻辑的方法。通过将UrlBasedCorsConfigurationSource实例传递给CorsFilter构造函数参数,您可以轻松获得与Spring本机CORS全局支持一样强大的功能。

如果您使用的是Spring Boot(支持Filterbean),它可能是这样的:

@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;
    }}


查看完整回答
反对 回复 2019-08-12
?
ITMISS

TA贡献1871条经验 获得超8个赞

自从Ingalls列车实现以来现在开始在Spring Data中支持CORS。有两种方法可以解决:

  1. @CrossOrigin带有指定originsmethodsallowedHeaders通过@RepositoryRestResource接口的注释。

    @CrossOrigin(...)@RepositoryRestResourcepublic interface PageRepository extends CrudRepository<Page, Long> { ... }
  2. 具有RepositoryRestConfiguration内部@Configuration类的全局配置。@CrossOrigin因此不需要标记存储库。

    @Configurationpublic class GlobalRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter {
    
        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
            config.getCorsRegistry()
                      .addMapping(CORS_BASE_PATTERN)
                      .allowedOrigins(ALLOWED_ORIGINS)
                      .allowedHeaders(ALLOWED_HEADERS)
                      .allowedMethods(ALLOWED_METHODS);
         }}


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 774 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信