Jhipster CORS 启用
Posted
技术标签:
【中文标题】Jhipster CORS 启用【英文标题】:Jhipster CORS enable 【发布时间】:2019-01-14 18:11:34 【问题描述】:我正在使用 Jhipster 生成 API。
我的 api 已开启,我们可以调用它:
https://api.staging.test.com/
我的 FE 应用程序已开启:
https://staging.test.com/
这是我在 application-prod.yml 中启用 Cors 的配置
cors:
allowed-origins: "https://staging.test.com/"
allowed-methods: "*"
allowed-headers: GET, PUT, POST, DELETE, OPTIONS
exposed-headers: "Authorization,Link,X-Total-Count"
allow-credentials: true
max-age: 1800
我仍然收到此错误:
对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。原点 'https://staging.test.com' 因此不是 允许访问。如果不透明的响应满足您的需求,请将 请求模式为“no-cors”以获取禁用 CORS 的资源。
在 Spring boot 中还需要做些什么来启用 CORS 吗?
【问题讨论】:
cors
键应该在jhipster
下,在您的 application-prod.yml 中是这样吗?
是的,是的,我测试了 cors 过滤器,他从 application-prod.yml 获得了很好的信息,其他东西不起作用
【参考方案1】:
要在 PROD 模式下启用 CORS,请在基础 application.yml
中注释掉 jhipster.cors
并根据需要进行自定义。
cors:
allowed-origins: 'https://staging.test.com'
allowed-methods: '*'
allowed-headers: '*'
exposed-headers: 'Authorization,Link,X-Total-Count,X-$jhipster.clientApp.name-alert,X-$jhipster.clientApp.name-error,X-$jhipster.clientApp.name-params'
allow-credentials: true
max-age: 1800
如果您配置了任何新的根路径,请确保它已在 WebConfigurer.java
中为 cors 注册
@Bean
public CorsFilter corsFilter()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = jHipsterProperties.getCors();
if (!CollectionUtils.isEmpty(config.getAllowedOrigins()))
log.debug("Registering CORS filter");
source.registerCorsConfiguration("/newrootpath/**", config); // add this
source.registerCorsConfiguration("/api/**", config);
source.registerCorsConfiguration("/management/**", config);
source.registerCorsConfiguration("/v2/api-docs", config);
source.registerCorsConfiguration("/v3/api-docs", config);
source.registerCorsConfiguration("/swagger-resources", config);
source.registerCorsConfiguration("/swagger-ui/**", config);
return new CorsFilter(source);
如果使用另一个 AuthenticationManager
(扩展 WebSecurityConfigurerAdapter
的类)配置新的根路径,请确保也在那里添加过滤器 CorsFilter
。
【讨论】:
这个解决方案对我有用。很清楚!谢谢伊曼纽尔【参考方案2】:面临同样的问题。我发现的最简单和最安全的方法是只为您需要在控制器中公开的特定方法启用 cors。
在为您的 api 提供服务的方法中,添加 @CrossOrigin("*")
注释。这在生产中有效,无需对 application-prod.yml 进行任何更改。
【讨论】:
我找到了一篇关于注释的好文章。 javaguides.net/2019/09/…【参考方案3】:在 JHipster 的 Prod 模式下启用 CORS 所需的唯一配置是设置 jhipster.cors
配置,如下所示。需要注意的一点是,如果您的前端使用端口,则需要将其包含在 allowed-origins
键中。
jhipster:
cors:
allowed-origins: "https://staging.test.com:8080"
allowed-methods: "*"
allowed-headers: "*"
exposed-headers: "Authorization,Link,X-Total-Count"
allow-credentials: true
max-age: 1800
这是由 JHipsterProperties 加载并在 WebConfigurer.java 中使用以应用 CORS 配置。
【讨论】:
我确实做到了,我得到:无法加载api.staging.test.com/api/tournaments:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源。因此不允许访问 Origin 'staging.test.com'。 根据该错误消息,不要放置端口,也不要放置尾随/
。 allowed-origins
应该与请求的 origin
标头完全匹配
您的应用前面是否有可能还需要 CORS 的负载均衡器或代理?
确保您自己添加的任何其他路径都包含在WebConfigurer.java 中(搜索“source.registerCorsConfiguration”)。以上是关于Jhipster CORS 启用的主要内容,如果未能解决你的问题,请参考以下文章
CORS Origin Spring Boot Jhipster - 飞行前失败