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