当前位置: 首页 > news >正文

解决saToken在Filter过滤器中使用时,报SaTokenContext 上下文尚未初始化错误

解决saToken在Filter过滤器中使用时,报SaTokenContext 上下文尚未初始化错误

@Component
@Slf4j
public class AuthorizeFilter implements GlobalFilter {@Override@NonNullpublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest newRequest = exchange.getRequest().mutate().header("X-User-ID", StpUtil.getLoginId(-1L).toString()).build();ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();return chain.filter(newExchange);}
}

以上代码运行时会报SaTokenContext 上下文尚未初始化错误

1.解决方法

既然没有SaTokenContext,那么就设置SaTokenContext就好了,所以就添加一个Filter设置SaTokenContext。

@Component
@Slf4j
@Order(SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER)
public class SaTokenContextFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//设置sa-token上下文log.info("SaTokenContextFilter set sa-token context");SaReactorSyncHolder.setContext(exchange);return chain.filter(exchange).doFinally(t -> {SaReactorSyncHolder.clearContext();});}
}

2.问题原因

经过跟踪发现是 SaTokenContextForThreadLocalStaff 类中以下方法box为空抛出的错误

    public static SaTokenContextModelBox getModelBox() {SaTokenContextModelBox box = (SaTokenContextModelBox)modelBoxThreadLocal.get();if (box == null) {throw (new SaTokenContextException("SaTokenContext 上下文尚未初始化")).setCode(10002);} else {return box;}}

3.解决问题过程

参考官网:自定义 SaTokenContext 指南 的解决方法

/*** SaTokenContext 上下文初始化过滤器 (基于 Servlet)*/
@Order(SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER)
public class SaTokenContextFilterForServlet implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {try {SaTokenContextServletUtil.setContext((HttpServletRequest) request, (HttpServletResponse) response);chain.doFilter(request, response);} finally {SaTokenContextServletUtil.clearContext();}}
}

发现官网方法适用于Servlet,并不适用于webflux,
于是参考: sa-token-starter/sa-token-reactor-spring-boot3-starter · dromara/Sa-Token - 码云 - 开源中国

@Order(SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER)
public class SaTokenContextFilterForReactor implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {return chain.filter(exchange).contextWrite(ctx -> SaReactorHolder.setContext(ctx, exchange, chain)).doFinally(r -> {// 在流式上下文中保存的数据会随着流式操作的结束而销毁,所以此处无需手动清除数据});}}

改为1.的最终结果

4.注意事项

  • 注意Filter的@Order顺序,SaTokenConsts.SA_TOKEN_CONTEXT_FILTER_ORDER = -104
  • 清除SaTokenContext必须在 chain.filter(exchange).doFinally(/* clear */) 中操作,否则会异步提前把SaTokenContext清楚了
  • 可以通过 SaManager.getSaTokenContext().isValid() 判断 SaTokenContext 是否初始化
http://www.sczhlp.com/news/71408/

相关文章:

  • 常州营销型网站建设企业官方网站建设运营方案
  • 自己做鲜花网站怎么样做外贸网站应该关注哪些地方
  • 网络营销教学网站网站建设的内容策略
  • 沈阳网站建设找世纪兴网站首页引导页模版
  • wordpress_子网站重命名wordpress制作百度地图xml
  • 重庆网站模板平台建设Wordpress显示成缩略图
  • 网站建设与管理方向旅游攻略网站模板
  • 福州专业网站建设公司网站建设费能算作广告费用吗
  • 滁州市网站建设科技公司四川绵阳网站建设
  • 商务网站建设实训报告总结东莞购物网站建设
  • 网站备案查询 whois银川网站建设设计
  • seo建站优化推广定制做网站服务
  • 企业网站的设计思路范文福州营销型网站建设价格
  • 网站论坛页怎么做建设网站的叫什么职位
  • 网站建设工具的种类在海口注册公司需要什么条件
  • 青岛制作网站网站设计开发的难点
  • 已经建网站做外贸ts431p 做网站
  • 做网站的技术门槛高吗商务网站建设与运营
  • 网站是用什么软件做的吗湘建网
  • 宝山企业做网站wordpress可以用html5吗
  • 零跑的电池供应商,比零跑多赚1.9亿
  • Codeforces 2133 记录
  • Typeless:能理解语音真实意图的转录工具;Chance AI:能够思考和行动的 Visual Agent丨日报
  • 做外贸网站的效果怎么样工程师证怎么考取需要什么条件
  • 网页设计板式网站重庆建设工程招标信息网
  • 门户网站通俗理解官方网站查询 优帮云
  • 网站建设教程小说室内设计平面图案例
  • 自己做网站表白网站建设预览
  • 哈尔滨网站建设流程企业每年向工商网站做申报
  • 轻量级WordPress长沙网站seo价格