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

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

我有两个应用程序。

在 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?

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

app.yaml 文件

runtime: java11
instance_class: F4
vpc_access_connector:
  name: projects/<project_id>/locations/<location>/connectors/<connectors_name>

这是我的配置文件:

CorsFilter配置.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: *

答案1

问题是应用引擎应用程序需要允许 CORS。

这可以在应用程序.yaml经过添加处理程序包含 CORS 标头,如下所示:

runtime: java11
instance_class: F4
vpc_access_connector:
  name: projects/<project_id>/locations/<location>/connectors/<connectors_name>
- url: /.*
  script: auto
  http_headers:
    Access-Control-Allow-Origin: *

这将允许 CORS 调用来自任何域,如果您希望更具体地仅允许您的 firebase 应用程序,您可以将其更改*为 firebase 应用程序 URL

答案2

您需要在标头中添加 Access-Control-Allow-Origin,并需要响应请求请尝试使用以下代码块

 header := w.Header()
 header.Add("Access-Control-Allow-Origin", "*")

响应初始请求

if r.Method == "OPTIONS" {
    w.WriteHeader(http.StatusOK)
    return
}

答案3

我的属性中允许的来源 URL 有误。因此,问题中的配置文件和所有 cors 配置均正确无误。

相关内容