我有两个应用程序。
在 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 配置均正确无误。