2017-10-27 1 views
6

So aktivieren Sie CORS in einem Spring 5 Webflux-Projekt?Aktivieren Sie CORS im Frühjahr 5 Webflux?

Ich kann keine ordnungsgemäße Dokumentation finden.

+0

https://docs.spring.io/spring-security/site/docs/5.0.x/reference/html/cors.html – sideshowbarker

+0

haben Sie @CrossOrigin (origins = "*") auf Ihrem Controller versucht? –

Antwort

5

Ich hatte Erfolg mit diesen kundenspezifischen Filter:

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpMethod; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.server.reactive.ServerHttpRequest; 
import org.springframework.http.server.reactive.ServerHttpResponse; 
import org.springframework.web.cors.reactive.CorsUtils; 
import org.springframework.web.server.ServerWebExchange; 
import org.springframework.web.server.WebFilter; 
import org.springframework.web.server.WebFilterChain; 

import reactor.core.publisher.Mono; 


@Configuration 
public class CorsConfiguration { 

    private static final String ALLOWED_HEADERS = "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN"; 
    private static final String ALLOWED_METHODS = "GET, PUT, POST, DELETE, OPTIONS"; 
    private static final String ALLOWED_ORIGIN = "*"; 
    private static final String MAX_AGE = "3600"; 

    @Bean 
    public WebFilter corsFilter() { 
    return (ServerWebExchange ctx, WebFilterChain chain) -> { 
     ServerHttpRequest request = ctx.getRequest(); 
     if (CorsUtils.isCorsRequest(request)) { 
     ServerHttpResponse response = ctx.getResponse(); 
     HttpHeaders headers = response.getHeaders(); 
     headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); 
     headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); 
     headers.add("Access-Control-Max-Age", MAX_AGE); 
     headers.add("Access-Control-Allow-Headers",ALLOWED_HEADERS); 
     if (request.getMethod() == HttpMethod.OPTIONS) { 
      response.setStatusCode(HttpStatus.OK); 
      return Mono.empty(); 
     } 
     } 
     return chain.filter(ctx); 
    }; 
    } 

} 

und org.springframework.boot:spring-boot-starter-web sollen nicht als Abhängigkeit einbezogen werden - Filter nicht mit ihm arbeiten.

+0

Für nicht-funktionale Modell in Spring WebFlux ist die empfohlene Art und Weise Filter-Funktionalität zu erreichen, wenn Netty und kein klassisches Servlet verwenden Filter und nicht mit Funktionsmodell-Filter wie oben? – ROCKY

+0

@ROCKY, ich hatte dieses Beispiel in Netty überprüft - es hat funktioniert. Ich denke, Sie können nicht-funktionale Modelle in Controllern verwenden und es wird funktionieren (aber nicht versucht es). –

1
@Configuration 
public class WebFluxConfig { 

    @Bean 
    public WebFluxConfigurer corsConfigurer() { 
     return new WebFluxConfigurerComposite() { 

      @Override 
      public void addCorsMappings(CorsRegistry registry) { 
       registry.addMapping("/**").allowedOrigins("*") 
         .allowedMethods("*"); 
      } 
     }; 
    } 
} 

, die entspricht:

@Bean 
public WebMvcConfigurer corsConfigurer() { 
    return new WebMvcConfigurerAdapter() { 

     @Override 
     public void addCorsMappings(CorsRegistry registry) { 

für Spring MVC.

+0

Danke für deine Antwort ... Ich werde dieses Wochenende ausprobieren. – Dachstein

+0

Ich habe Ihre Antwort mit Spring-Cloud-Starter-Gateway versucht (es verwenden spring 5 Webflux) - kein Erfolg –

Verwandte Themen