webflux 不设置Access-Control-Allow-Origin
时间: 2025-01-04 21:30:52 浏览: 10
### 解决方案
在 Spring WebFlux 中正确配置 CORS 可以通过多种方式实现,其中一种常见的方式是在 `WebFilter` 或者全局配置中处理。为了确保 HTTP 响应头部包含 `Access-Control-Allow-Origin` 字段,在应用启动类或配置类中添加相应的 CORS 配置是必要的。
#### 方法一:基于 Java Config 的全局配置
创建一个新的配置类来启用跨域支持:
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
config.addAllowedOriginPattern("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
```
这段代码设置了允许所有的 HTTP 请求方法、响应头以及来源域名,并启用了凭证共享[^1]。
#### 方法二:局部路由级别的 CORS 设置
如果只需要针对特定路径开启 CORS 支持,则可以在定义 RouterFunction 时指定:
```java
@Bean
RouterFunction<ServerResponse> routes(CorsHandler handler){
return route(GET("/api/v1/*"),handler::handleGetRequest)
.and(route(POST("/api/v1/*"),handler::handlePostRequest))
.filter((request, next) -> {
ServerHttpRequest decorated = request.mutate()
.header("Access-Control-Allow-Origin","*") // 这里也可以动态决定具体哪个源被允许
.build();
return next.exchange(decorated);
});
}
```
这种方式适用于更细粒度控制的情况,比如只希望部分 API 接口开放给外部调用[^2]。
对于上述提到的预检请求失败问题(Preflight Request),即 OPTIONS 请求未能成功获取到预期中的 CORS 头部信息,可以通过调整服务器端 CORS 策略来解决这个问题。通常情况下,当客户端发起非简单请求之前会先发出一次 OPTIONS 类型的探测性请求询问服务端是否接受即将发生的实际操作;此时就需要特别注意确保这些预检请求能够得到正确的回应并携带合适的 CORS 相关头部信息[^3]。
阅读全文