使用Gateway + Sa-token跨域问题解决

问题背景

我的项目是Boot项目改造成的微服务项目,请求流程是,前端发送请求到网关,网关再路由到其他服务。所以我将其他服务的跨域配置删除,在网关中进行跨域配置。也是踩了一会坑。

解决

增加加全局 WebFilter 强制加 CORS 头

java
复制代码
@Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CorsResponseHeaderFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { ServerHttpResponse response = exchange.getResponse(); response.getHeaders().set("Access-Control-Allow-Origin", "http://localhost:xxxx"); response.getHeaders().set("Access-Control-Allow-Credentials", "true"); response.getHeaders().set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH"); response.getHeaders().set("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,Accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers"); return chain.filter(exchange); } }

放行OPTIONS请求

java
复制代码
/** * [Sa-Token 权限认证] 配置类 * * @author mi */ @Configuration public class SaTokenConfigure { // 注册 Sa-Token全局过滤器 @Bean public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 拦截地址 .addInclude("/**") /* 拦截全部path */ // 开放地址 .setExcludeList(WITH_PATH) // 鉴权方法:每次访问进入 .setAuth(obj -> { // 更多匹配 ... */ }).setBeforeAuth(o -> { // 跨域支持 放行OPTIONS SaRouter.match(SaHttpMethod.OPTIONS) .back(); }) .setError(e -> SaResult.error(e.getMessage())); } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
睿智
下载 APP