gpt4 book ai didi

java - Spring Data Rest 和 Cors

转载 作者:IT老高 更新时间:2023-10-28 13:02:40 28 4
gpt4 key购买 nike

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

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

请求的资源上不存在“Access-Control-Allow-Origin” header 。产地'http://localhost:63343 ' 因此不允许访问。

经过一些调试,我发现以下内容:AbstractHandlerMapping.corsConfiguration 为除 RepositoryRestHandlerMapping 之外的所有子类填充。在 RepositoryRestHandlerMapping 中,没有 corsConfiguration 在创建时存在/设置,因此它不会被识别为 cors 路径/资源。
=> 没有附加 CORS header
这可能是问题吗?我该如何设置?

配置类:

@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> {


}

原始请求 header :

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

原始响应 header :

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.M2Spring 4.2.0.RC2

我错过了什么?

最佳答案

确实,在 Spring Data REST 2.6 (Ingalls) 之前,只有由 Spring MVC WebMvcConfigurationSupport 创建的 HandlerMapping 实例和使用 @CrossOrigin 注释的 Controller 是 CORS知道。

但是现在 DATAREST-573已修复,RepositoryRestConfiguration 现在公开了一个 getCorsRegistry() 用于全局设置,并且还可以识别存储库上的 @CrossOrigin 注释,因此这是推荐的方法.见 https://stackoverflow.com/a/42403956/1092077回答具体例子。

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

如果你使用的是 Spring Boot(它支持 Filter bean),它可能是这样的:

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

关于java - Spring Data Rest 和 Cors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31724994/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com