我有两个应用程序。
在 Firebase 上运行的前端(Angular)
在 App Engine 上运行的后端 Spring Boot (Java11)
尝试访问应用引擎中的任何端点时出现此错误"Access has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource"
有趣的是,在我的本地机器上一切正常。cors没有问题。所以,我猜问题出在应用引擎的配置或其他方面。
有人可以帮我解决这个问题吗?我已经花了很多时间试图修复它。已经阅读了很多 stackoverflow 类似的问题。上一篇:如何在 Spring Boot + Spring Security 应用中配置 CORS?
在谷歌文档中找不到任何有用的东西。
app.yaml 文件
runtime: java11
instance_class: F4
vpc_access_connector:
name: projects/<project_id>/locations/<location>/connectors/<connectors_name>
这是我的配置文件:
CorsFilterConfig.java
@Configuration
public class CorsFilterConfig {
@Value("${allowed-origin}")
private String allowedOrigin;
@Bean
public FilterRegistrationBean<CorsFilter> simpleCorsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(Collections.singletonList(allowedOrigin));
config.setAllowedMethods(Collections.singletonList("*"));
config.setAllowedHeaders(Collections.singletonList("*"));
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
allowedOrigin
指向https://<firebase.domain>
安全配置.java
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
.authorizeRequests().anyRequest().authenticated()
.and()
.oauth2Login()
.and()
.oauth2ResourceServer().jwt();
端点示例
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {
@GetMapping
public String hello() {
return "hello world";
}
}
我猜您不能使用 app.yaml 来控制动态处理程序的 HTTP 标头。仅适用于静态内容
这就是为什么此配置无法部署并出现此错误的原因
"Unexpected attribute "http_headers" for mapping type script."
runtime: java11
instance_class: F4
vpc_access_connector:
name: projects/<project_id>/locations/<location>/connectors/<connectors_name>
handlers:
- url: /.*
script: auto
http_headers:
Access-Control-Allow-Origin: *
问题是应用引擎应用程序需要允许 CORS。
这可以在app.yaml上通过添加一个处理程序来包含 CORS 标头,如下所示:
这将允许 CORS 调用来自任何域,如果您希望更具体地只允许您的 firebase 应用程序,您可以将其更改为
*
firebase 应用程序 URL您需要将 Access-Control-Allow-Origin 添加到标头并需要响应请求 请尝试使用以下代码块
响应初始请求
我的属性中有错误的允许来源的 URL。所以我问题中的配置文件和所有 cors 配置都是正确的。