Spring Boot с Webflux: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin» - PullRequest
0 голосов
/ 28 января 2020

Я пытался создать бэкэнд Spring Boot и подключить к нему мой интерфейс React. В моем локальном развертывании мои запросы API терпят неудачу, потому что CrossOrigin не поддерживается localhost: 3000. Я вставил «CORSGlobalConfig» в мой Spring Boot:

@Configuration
@EnableWebFlux
public class CorsGlobalConfig implements WebFluxConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) {
        corsRegistry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("PUT","POST","GET");
    }
}

На мой взгляд, это должно работать нормально, но что-то не так. Нужно ли где-нибудь реализовывать мою конфигурацию? Ошибка выглядит следующим образом:

Access to XMLHttpRequest at 'http://localhost:8080/REQUESTPATH'
from origin 'http://localhost:3000' 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.

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 29 января 2020

Я исправил это, добавив следующий CorsConfig к «com.package.project.config»:

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("http://localhost:3000");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");

        source.registerCorsConfiguration("/api/v2/**", config);
        return new CorsFilter(source);
    }

}

И также добавив фильтр (в «com.package.project.filter») для «Access» -Control-Allow-Headers "," Access-Control-Allow-Methods "и" Access-Control-Allow-Origin ". Все они построены так:

@Component
public class AddControlHeaderWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        exchange.getResponse()
                .getHeaders()
                .add("Access-Control-Allow-Headers", "*");
        return chain.filter(exchange);
    }
}

Надеюсь, что это может помочь кому-то с такой же проблемой!

Источник: https://www.baeldung.com/spring-response-header
Конфиг Источник: https://github.com/szerhusenBC/jwt-spring-security-demo

0 голосов
/ 10 мая 2020

Если вы используете Spring Securuty, взгляните на его конфигурацию cors. Аналогичен предложению bnexd , но встроен в цепочку фильтров безопасности

@Bean
public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
    return http
        .cors().configurationSource(createCorsConfigSource()).and()
        // your security rules
        .build();
}

public CorsConfigurationSource createCorsConfigSource() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("http://localhost:3000");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");

    source.registerCorsConfiguration("/**", config);
    return source;
}
0 голосов
/ 28 января 2020

Обычно я не вижу проблем с вашими конфигурациями.

Но вы можете добавить опцию ОПЦИИ.

.allowedMethods("PUT","POST","GET" "OPTIONS");
...