当前位置: 首页 > 知识库问答 >
问题:

Spring Data Rest和Cors

红经亘
2023-03-14

我正在开发一个带有Rest接口和前端dart的Spring Boot应用程序。

XMLHttpRequest确实执行了一个完全正确处理的选项请求。在此之后,发出最终的GET(“/products”)请求并失败:

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

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

我错过了什么?

共有1个答案

梁磊
2023-03-14

实际上,在Spring Data REST 2.6(Ingalls)之前,只有Spring MVCWebMVCConfigurationSupport创建的HandlerMapping实例和用@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,它使用了@crossoriginAddCorsMappings(CorsRegistry registry)所使用的相同的CORS处理逻辑。通过将URLBasedCORSConfigurationSource实例传递给CORSFilter构造函数参数,您可以轻松获得Spring本机CORS全局支持这样强大的功能。

如果您使用的是Spring Boot(它支持filterbean),那么它可能如下所示:

@Configuration
public 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;
    }
}
 类似资料:
  • 我尝试使用MockMVC和TestRestTemboard。在这两种情况下,返回的响应都是404,但是APIendpoint在集成测试之外工作(当我自己运行Spring应用时)。 有没有人有一个可以工作的示例应用程序,它使用SpringDataREST对生成的控制器进行了工作集成测试? 我还可以编写针对自己控制器的常规集成测试(非SDR类型) 测试代码: 回购: 好的,我发现了问题,但我不知道答案

  • 我不想公开我的模型类(jpa实体),而是用不同的数据传输对象(DTO)公开它们属性的不同子集。这个想法是不切实际的 例子: 实体: JpaRepository: DTO: D到积垢积存物: 实施: 一般: 在本例中,我想用Spring数据REST公开GroupDtoDao。 在其他bean中,我可以自动连接GroupDto和GroupDto,所以两者都由Spring的上下文管理。如果我不使用@Re

  • 正如我们所知,在SpringDataRest中,存储库文件只被使用(而不是控制器),我们可以为它使用内置方法。 我不想添加自定义方法,并在那里添加我的请求处理逻辑。我想要一些配置或事件重写,在这里我可以处理HttpRequest处理程序,解析令牌并检查令牌中的一些数据,根据该令牌,我将决定要么处理该请求,要么放弃它,但出现一些错误。 谢了。

  • 当我们需要调用Ajax请求时,我们需要: 我已经知道,使用,我们可以发出一个跨源请求,并添加源标题。 问题: > 它是在浏览器(支持CORS)执行请求时添加的吗?(跨域还是非跨域? 我的意思是:他**是什么意思? 跨源HTTP请求有一个源标头。此标头向服务器提供请求的来源。此标头受浏览器保护,不能从应用程序代码更改。本质上,它是跨文档消息传递中使用的消息事件上的origin属性的网络等价物。原始标

  • 我最近开始学习node.js和socket.io。我遵循了socket.io的一个简单教程,它在我的电脑上运行时一切正常。然而,我决定将客户端上传到服务器进行测试,这就是问题的开始。我想在web主机上运行聊天客户端,在我的计算机或其他主机上运行服务器。基本上,我计划对服务器进行端口转发,并让客户机在网页上运行。我打开我的端口到端口转发,它似乎是工作的,但是我每次都在网页上得到错误。 我一直在弄乱代

  • 问题内容: 我的问题很简单,但我找不到答案,也没有自己进行测试的资源。我可以从一个域向另一个HTTPS域发出HTTPS CORS请求吗?我可以从一个域向另一个HTTPS域发出HTTP CORS请求吗?我知道,我可以执行从一个域到另一个HTTP域的HTTP CORS请求,但是当使用HTTPS时,我不知道是否存在任何区别。 谢谢, 菲利普 问题答案: 是的,您可以从一个HTTPS域向另一个HTTPS域

  • 问题内容: 我正在开发一个带有Rest接口和一个飞镖的Spring Boot应用程序。 XMLHttpRequest确实执行一个OPTIONS请求,该请求的处理完全正确。此后,发出最终的GET(“ / products”)请求,但请求失败: 所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源’ http:// localhost:63343 ‘

  • 问题内容: 当我们需要调用Ajax请求时,我们要做的是: 我已经知道,使用,我们可以提出跨源请求 , 并且添加了ORIGIN标头。 题: 何时 添加此标头? 当浏览器(支持CORS)执行请求时是否添加?(跨域还是非跨域?) 还是在浏览器“看到”请求目标来源与当前来源不同时自动添加? 我的意思是:He **是什么意思? 跨域HTTP请求具有一个Origin头。该头为服务器提供请求的来源。此标头受浏览