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

【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇

在上一篇《【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇》中,凯哥(公众号:凯哥Java)介绍了了产生这个问题的源码在哪里,以及怎么解决的方案。没有给出实际操作步骤。

本文,凯哥就通过threadLocal方案来解决。

一、创建用于存放共享变量的对象

代码如下:

package com.kaigejava.dataanalysis;import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@Data
@Slf4j
public class ThreadShareDataDTO {/*** 是否拥有数据查看权限。* 用来解决:SaToken,非Web上下文无法获取Request问题的*/private Boolean hasDataViewRole;//防止new,生成单例类private ThreadShareDataDTO(){}/*** ThreadLocal:将变量与当前线程绑定,相当于Map<Thread, value>* 此处使用的是饱汉模式构造*/private static ThreadLocal<ThreadShareDataDTO> threadLocal = new ThreadLocal<>();/*** 返回当前线程的单例* 此处不需要使用关键字synchronized,想想为什么?*/public static ThreadShareDataDTO getCurrentThreadInstance() {ThreadShareDataDTO shareData = threadLocal.get();if (shareData == null) {shareData = new ThreadShareDataDTO();threadLocal.set(shareData);}return shareData;}public static void clear(){log.info("开始移除threadLocal中数据");threadLocal.remove();}}

二、在开启子线程的时候,将需要传递的参数设置到threadLocal中

public void startCreateDataReport(TenantMonitorReportListRequest param) {boolean hasDataViewRole = StpUtil.hasRole(dataViewRole);param.setHasDataViewRole(hasDataViewRole);new  MakeReportThread(param).start();}

三、在子线程中获取到共享变量

boolean hasDataViewRole ;
ThreadShareDataDTO shardData = ThreadShareDataDTO.getCurrentThreadInstance();
if (Objects.nonNull(shardData.getHasDataViewRole())) {hasDataViewRole = shardData.getHasDataViewRole();
} else {hasDataViewRole = StpUtil.hasRole(dataViewRole);
}

说明:

先从threadLocal中获取共享变量,如果存在,就直接获取。如果不存在在调用原来的方法。

四、使用完成之后,已经要记得remove掉

在线程执行完成之后,finally方法中移除:

} finally {//从threadLocal中移除ThreadShareDataDTO.clear();
}

http://www.lryc.cn/news/261193.html

相关文章:

  • 论文润色机构哪个好 快码论文
  • Idea执行bat使用maven打包springboot项目成docker镜像并push到Harbor
  • NCNN 源码学习【三】:数据处理
  • RabbitMq基本使用
  • windows wsl2 ubuntu上部署 redroid云手机
  • 创维电视机 | 用当贝播放器解决创维电视机不能播放MKV视频的问题
  • 【STM32】DMA直接存储器存取
  • Vue3-09-条件渲染-v-show 的基本使用
  • ArrayList与LinkLIst
  • 位运算(、|、^、~、>>、<<)
  • Centos7部署SVN
  • Vue中this.$nextTick的执行时机
  • Unity中的ShaderToy
  • 2 使用postman进行接口测试
  • 【数据库设计和SQL基础语法】--查询数据--聚合函数
  • Module ‘app‘: platform ‘android-33‘ not found.
  • MySQL按序批量操作大量数据
  • strict-origin-when-cross-origin
  • 【置顶】 本博博文汇总
  • react.js源码二
  • 如何学习英语
  • robot测试自动化
  • Linux---重定向命令
  • 小区生活污水处理需要哪些设备和工艺
  • 【高性能计算】Cpp + Eigen + Intel MKL + 函数写成传引用
  • 【教学类-05-02】20231216 (比大小> <=)X-Y之间的比大小88题(补全88格子,有空格分割提示)
  • 【Spark精讲】Spark与MapReduce对比
  • SQL错题集3
  • Elasticsearch:使用 OpenAI 生成嵌入并进行向量搜索 - nodejs
  • [python高级编程]:02-类