如何使用webflux处理Spring Boot 2中的HTTP OPTIONS请求?

问题描述 投票:2回答:3

我将cors配置如下:

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

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

我的POST是这样的:

@Bean
RouterFunction<ServerResponse> routes() {
    return route(POST("/create")
                          .and(accept(APPLICATION_JSON))
                          .and(contentType(APPLICATION_JSON)), serverRequest 
                                 -> create(serverRequest);
}

无论如何,我的角度应用程序无法发出任何请求,直到我添加OPTIONS路由,如下所示:

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

这有必要吗?有没有办法删除此OPTIONS处理?

java spring spring-webflux
3个回答
2
投票

我不认为WebFlux功能端点支持这一点。 Spring Framework reference documentation points to the CorsWebFilter instead

您可以定义CorsWebFilter @Bean并使用自定义CorsConfiguration配置它以实现相同的目的。


1
投票

这取决于。

如果您的后端和前端构建在同一服务器上并使用相同的端口,则无需支持OPTIONS。

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

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


1
投票

OPTIONS请求是跨域资源共享(CORS)中的飞行前请求,并且它们需要跨不同来源发出请求。

这种飞行前请求是由一些浏览器作为安全措施来确保服务器信任服务器所知的方法,请求发送的源和头是安全的。

这是过程的工作原理:

  1. 客户端使用OPTIONS向服务器发送请求
  2. 如果OPTIONS请求正常,则客户端向服务器发送实际请求。

您可能还需要公开标题。

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

            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*")
                        .allowedMethods("*")
                .exposedHeaders("*");
            }
        };
    }
© www.soinside.com 2019 - 2024. All rights reserved.