java 服务器上 Google App Engine 中的 CORS 错误
CORS Error in Google App Engine on java server
我有两个应用程序。
Firebase 上的前端(Angular)运行
后端 Spring 在 App Engine 上启动 (Java11) 运行
尝试访问 App Engine 中的任何端点时出现此错误
"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没有问题。
所以,我猜问题出在应用引擎的配置或其他方面。
有人可以帮我解决这个问题吗?我已经花了很多时间试图修复它。
已经看了很多Whosebug类似的问题。
最后一个:How to configure CORS in a Spring Boot + Spring Security application?
在 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";
}
}
我认为您的应用引擎 yaml 文件需要在处理程序中允许 cors,
你可以使用这个例子
handlers:
- url: /images
static_dir: static/images
http_headers:
Access-Control-Allow-Origin: https://frontend.firebase.url.com
您也可以使用 * 而不是指定 url 来允许访问
我想您不能使用 app.yaml 来控制动态处理程序的 HTTP headers。仅适用于静态内容
这就是此配置无法部署并出现此错误的原因 "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: *
我的属性中允许来源的 URL 有误。所以我问题中的配置文件和所有cors配置都是正确的。
我有两个应用程序。
Firebase 上的前端(Angular)运行
后端 Spring 在 App Engine 上启动 (Java11) 运行
尝试访问 App Engine 中的任何端点时出现此错误
"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没有问题。 所以,我猜问题出在应用引擎的配置或其他方面。
有人可以帮我解决这个问题吗?我已经花了很多时间试图修复它。 已经看了很多Whosebug类似的问题。 最后一个:How to configure CORS in a Spring Boot + Spring Security application?
在 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";
}
}
我认为您的应用引擎 yaml 文件需要在处理程序中允许 cors, 你可以使用这个例子
handlers:
- url: /images
static_dir: static/images
http_headers:
Access-Control-Allow-Origin: https://frontend.firebase.url.com
您也可以使用 * 而不是指定 url 来允许访问
我想您不能使用 app.yaml 来控制动态处理程序的 HTTP headers。仅适用于静态内容
这就是此配置无法部署并出现此错误的原因 "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: *
我的属性中允许来源的 URL 有误。所以我问题中的配置文件和所有cors配置都是正确的。