Java

Java伺服器上Google App Engine中的CORS錯誤

  • January 4, 2021

我有兩個應用程序。

在 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文件中找不到任何有用的東西。

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";
   }
}

我猜您不能使用 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 標頭,如下所示:

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

您需要將 Access-Control-Allow-Origin 添加到標頭並需要響應請求 請嘗試使用以下程式碼塊

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

響應初始請求

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

引用自:https://serverfault.com/questions/1040538