2017-10-27 15 views
6

Làm cách nào để kích hoạt CORS trong dự án Springflux Web 5?Bật CORS trong Spring 5 Webflux?

Tôi không thể tìm thấy bất kỳ tài liệu thích hợp nào.

+0

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

+0

bạn đã thử @CrossOrigin (nguồn gốc = "*") trên bộ điều khiển của bạn chưa? –

Trả lời

5

Tôi đã thành công với bộ lọc tùy chỉnh này:

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); 
    }; 
    } 

} 

org.springframework.boot:spring-boot-starter-web không nên được đưa vào như phụ thuộc - lọc không làm việc với nó.

+0

Đối với mô hình phi chức năng trong Spring WebFlux, cách nào được đề xuất để đạt được bộ lọc như chức năng nếu sử dụng Netty và không có servlet cổ điển bộ lọc và không sử dụng các bộ lọc mô hình chức năng như trên? – ROCKY

+0

@ ROCKY, tôi đã kiểm tra ví dụ này trong netty - nó hoạt động. Tôi nghĩ rằng bạn có thể sử dụng mô hình phi chức năng trong bộ điều khiển và nó sẽ làm việc (tuy nhiên haven't đã thử nó). –

1
@Configuration 
public class WebFluxConfig { 

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

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

tương ứng với:

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

     @Override 
     public void addCorsMappings(CorsRegistry registry) { 

cho MVC mùa xuân.

+0

Cảm ơn bạn đã trả lời ... Tôi sẽ thử vào cuối tuần này. – Dachstein

+0

Tôi đã thử câu trả lời của bạn với spring-cloud-starter-gateway (nó sử dụng spring 5 webflux) - không thành công –

Các vấn đề liên quan