【问题标题】:CORS Error in Google App Engine on java server [closed]Java服务器上Google App Engine中的CORS错误[关闭]
【发布时间】:2021-02-11 23:45:17
【问题描述】:

我有两个应用程序。

在 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 类似的问题。 最后一个:How to configure CORS in a Spring Boot + Spring Security application?

在谷歌文档中找不到任何有用的东西。

这是我的 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://&lt;firebase.domain&gt; 安全配置.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";
    }
}

【问题讨论】:

    标签: java spring-boot google-app-engine google-cloud-platform cors


    【解决方案1】:

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

    这就是为什么此配置无法部署并出现此错误"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: *
    

    【讨论】:

      【解决方案2】:

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

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

      你也可以用*代替指定url来允许访问

      【讨论】:

      • 我猜这个处理程序只适用于你后端的资源,不适用于端点。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-20
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2012-07-25
        相关资源
        最近更新 更多