Java 如何使用webflux处理SpringBoot2中的HTTP选项请求?

Java 如何使用webflux处理SpringBoot2中的HTTP选项请求?,java,spring,spring-webflux,Java,Spring,Spring Webflux,我将cors配置如下: @Bean WebFluxConfigurer corsConfigurer() { return new WebFluxConfigurerComposite() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("*")

我将cors配置如下:

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

        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedOrigins("*")
                    .allowedMethods("*");
        }
    };
}
我的帖子是这样的:

@Bean
RouterFunction<ServerResponse> routes() {
    return route(POST("/create")
                          .and(accept(APPLICATION_JSON))
                          .and(contentType(APPLICATION_JSON)), serverRequest 
                                 -> create(serverRequest);
}
@Bean
路由函数路由(){
返回路线(POST(“/create”)
.和(接受(应用程序)
.and(contentType(APPLICATION_JSON)),serverRequest
->创建(服务器请求);
}
无论如何,我的angular应用程序无法发出任何请求,除非我添加如下选项:

@Bean
RouterFunction<ServerResponse> routes() {
    return route(POST("/create")
                          .and(accept(APPLICATION_JSON))
                          .and(contentType(APPLICATION_JSON)), serverRequest 
                                 -> create(serverRequest)
         .andRoute(OPTIONS("/create"), serverRequest -> ServerResponse.ok().build());
}
@Bean
路由函数路由(){
返回路线(POST(“/create”)
.和(接受(应用程序)
.and(contentType(APPLICATION_JSON)),serverRequest
->创建(服务器请求)
.andRoute(选项(“/create”)、serverRequest->ServerResponse.ok().build();
}

有必要吗?有没有办法删除此选项处理?

选项请求是跨来源资源共享(CORS)中的飞行前请求,需要它们跨不同来源发出请求

此飞行前请求是由某些浏览器作为安全措施发出的,以确保正在执行的请求受到服务器的信任,即服务器了解请求中发送的方法、来源和头是安全的

这就是过程的工作原理:

  • 客户端使用选项向服务器发送请求
  • 若选项请求正常,则客户端将实际请求发送到服务器
  • 您可能还需要公开标题

    @Bean
        WebFluxConfigurer corsConfigurer() {
            return new WebFluxConfigurerComposite() {
    
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedOrigins("*")
                            .allowedMethods("*")
                    .exposedHeaders("*");
                }
            };
        }
    
    这要看情况而定

    如果后端和前端构建在同一台服务器上并使用相同的端口, 不需要支持选项

    如果没有,则必须支持选项,因为它用于标识服务器上允许哪些方法来防止/允许CORS(跨源资源共享)

    所有最新的现代浏览器都是通过发送HTTP选项进行检查来实现CORS的。
    如果您的服务器拒绝或拒绝您的请求,浏览器将禁止您的请求。

    我认为WebFlux功能端点不支持这一点


    您可以定义
    CorsWebFilter
    @Bean
    并使用自定义
    corscoConfiguration
    对其进行配置,以实现相同的目的。

    我也遇到过通过“addCorsMappings”添加CORS的问题(与您一样) 上面的配置似乎不支持选项路由。仅此项

    @Bean
    CorsWebFilter corsFilter(){
    CorsConfiguration配置=新的CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin(“http://domain1.com");
    config.addAllowedHeader(“*”);
    config.addAllowedMethod(“*”);
    UrlBasedCorsConfigurationSource=新的UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration(“/**”,config);
    返回新的CorsWebFilter(源);
    }
    
    感谢您的回复。但是,带Corsmap的WebLuxConfigurer难道还不够吗?我已经允许了所有方法的所有重新尝试,那么为什么还要费心创建另一个带有选项的路由呢?谢谢您的回复。但是,带Corsmap的WebLuxConfigurer难道还不够吗?我已经允许了所有方法的所有重新尝试,那么为什么还要费心创建一个呢使用选项?设置另一个路由,以使用功能终结点配置cors。这很有效,谢谢!但我仍然不明白其中的区别。我将发布另一个问题。正如下面提到的,WebFluxConfigure不使用功能终结点,CorsWebFilter可以。上面建议的显式选项处理不是必需的,但请记住该选项的请求将需要包括源代码和访问控制请求方法头-在测试中让我抓到了,因为我没有添加后面的。