前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇

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

原创
作者头像
凯哥Java
发布2023-12-25 12:46:51
8891
发布2023-12-25 12:46:51
举报
文章被收录于专栏:凯哥Java凯哥Java

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

代码如下:

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(); }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、创建用于存放共享变量的对象
  • 二、在开启子线程的时候,将需要传递的参数设置到threadLocal中
  • 三、在子线程中获取到共享变量
  • 四、使用完成之后,已经要记得remove掉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档