java 服务器上 Google App Engine 中的 CORS 错误

CORS Error in Google App Engine on java server

我有两个应用程序。

Firebase 上的前端(Angular)运行

后端 Spring 在 App Engine 上启动 (Java11) 运行

尝试访问 App Engine 中的任何端点时出现此错误 "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没有问题。 所以,我猜问题出在应用引擎的配置或其他方面。

有人可以帮我解决这个问题吗?我已经花了很多时间试图修复它。 已经看了很多Whosebug类似的问题。 最后一个:How to configure CORS in a Spring Boot + Spring Security application?

在 google 文档中找不到任何有用的内容。

这是我的 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> SecurityConfig.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";
    }
}

我认为您的应用引擎 yaml 文件需要在处理程序中允许 cors, 你可以使用这个例子

handlers:
- url: /images
  static_dir: static/images
  http_headers:
    Access-Control-Allow-Origin: https://frontend.firebase.url.com

您也可以使用 * 而不是指定 url 来允许访问

我想您不能使用 app.yaml 来控制动态处理程序的 HTTP headers。仅适用于静态内容

这就是此配置无法部署并出现此错误的原因 "Unexpected attribute "http_headers" for mapping type script."

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: *

我的属性中允许来源的 URL 有误。所以我问题中的配置文件和所有cors配置都是正确的。