Java 如何使用webflux处理SpringBoot2中的HTTP选项请求?
我将cors配置如下: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("*")
@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可以。上面建议的显式选项处理不是必需的,但请记住该选项的请求将需要包括源代码和访问控制请求方法头-在测试中让我抓到了,因为我没有添加后面的。