JS 访问 ZUUL 后的 Spring REST 服务被 CORS 策略阻止
JS access to Spring REST services behind ZUUL blocked by CORS policy
我正在使用各种 Spring 云框架构建一个小型 service-based 平台。各个组成部分如下:
- 一个 Eureka 发现服务器
- 一台Spring-Config台服务器
- 一个认证服务器
- 一个 Zuul 网关服务器
- REST 服务
- 一个 PostgreSQL 服务器
- 一个简单的 JQuery-based 客户端 运行 在浏览器中
(是的,这是基于 Manning "Spring Microservices in Action" 中提出的设计)
这在开发中一切正常。但是我最近将所有这些 server-side 东西部署到外部服务器 (运行 docker-compose),我无法再访问服务端点。
通过 JQuery 调用服务端点时出现以下错误:
对“https://my.domain.com/api/resource/123/subresource/456' from origin 'http://localhost:8080”处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有 'Access-Control-Allow-Origin' header 存在于请求的资源。
我尝试将以下内容添加到 Zuul 服务器(在同一个@EnableZuulProxy Spring 启动应用程序 class 中):
@Bean
public FilterRegsitrationBean corsFilter() {
UrlBaseCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("*", config);
FilterRegistrationBean<CorsFilter> bean =
new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
这产生了同样的错误。
有什么想法吗?
在Controller中,需要添加@RestController/@Controller注解
@CrossOrigin
像这样:
@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController
试试这个。
好的,所以我通过从服务中删除所有 Cors 配置并将其添加到 Zuul 网关来修复它。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("POST", "PUT", "GET", "OPTIONS", "DELETE", "HEAD");
}
}
它有效,但我不知道为什么我以前的尝试没有(而且我显然讨厌在不了解如何解决问题的情况下修复某些东西)。所以如果有人有任何想法...
干杯
我正在使用各种 Spring 云框架构建一个小型 service-based 平台。各个组成部分如下:
- 一个 Eureka 发现服务器
- 一台Spring-Config台服务器
- 一个认证服务器
- 一个 Zuul 网关服务器
- REST 服务
- 一个 PostgreSQL 服务器
- 一个简单的 JQuery-based 客户端 运行 在浏览器中
(是的,这是基于 Manning "Spring Microservices in Action" 中提出的设计)
这在开发中一切正常。但是我最近将所有这些 server-side 东西部署到外部服务器 (运行 docker-compose),我无法再访问服务端点。
通过 JQuery 调用服务端点时出现以下错误:
对“https://my.domain.com/api/resource/123/subresource/456' from origin 'http://localhost:8080”处的 XMLHttpRequest 的访问已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有 'Access-Control-Allow-Origin' header 存在于请求的资源。
我尝试将以下内容添加到 Zuul 服务器(在同一个@EnableZuulProxy Spring 启动应用程序 class 中):
@Bean
public FilterRegsitrationBean corsFilter() {
UrlBaseCorsConfigurationSource source =
new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("*", config);
FilterRegistrationBean<CorsFilter> bean =
new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
这产生了同样的错误。
有什么想法吗?
在Controller中,需要添加@RestController/@Controller注解
@CrossOrigin
像这样:
@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController
试试这个。
好的,所以我通过从服务中删除所有 Cors 配置并将其添加到 Zuul 网关来修复它。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("POST", "PUT", "GET", "OPTIONS", "DELETE", "HEAD");
}
}
它有效,但我不知道为什么我以前的尝试没有(而且我显然讨厌在不了解如何解决问题的情况下修复某些东西)。所以如果有人有任何想法...
干杯