У меня есть два приложения.
Фронтенд (Angular) работает на Firebase
Backend Spring Boot (Java11) работает в приложении Движок
Получил эту ошибку при попытке доступа к любым конечным точкам в движке приложения «Доступ заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: нет« Access-Control-Allow-Origin » заголовок присутствует на запрошенном ресурсе "
Интересно, что на моем локальном компьютере все работает нормально. Проблем с cors нет. Итак, я предполагаю, что проблема в конфигурации движка приложения или что-то еще.
Может Кто-нибудь поможет мне решить эту проблему? Я уже потратил много времени, пытаясь ее исправить. Я уже читал много похожих проблем с stackoverflow. Последний: как настроить CORS в приложении Spring Boot + Spring Security?
Не могу найти ничего полезного в документах 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: //
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 для динамических обработчики. Это применимо только для статического контента
Вот почему эту конфигурацию не удается развернуть с этой ошибкой
«Неожиданный атрибут« http_headers »для сценария типа сопоставления.»
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: *
У меня были неправильные URL-адреса разрешенного происхождения в моих свойствах. Итак, конфигурационные файлы и вся конфигурация cors в моем вопросе верны.
Проблема в том, что 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, вы можете изменить *
на URL-адрес приложения firebase
Вам нужно добавить Access-Control-Allow-Origin в заголовки и ответить на запрос Попробуйте использовать следующие блоки кода
header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
Ответить на первоначальный запрос
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}