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

news2024/9/23 23:32:54

在上一篇《【理论篇】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.coloradmin.cn/o/1315677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL错题集3

1.薪水第二多的员工的emp_no以及其对应的薪水salary limit a,b 其中a表示查询数据的起始位置&#xff0c;b表示返回的数量。 &#xff08;MySQL数据库中的记录是从0开始的&#xff09; 注意从0开始 2.员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth 聚合函数不能…

006 Windows共享

一、共享要求 一般是局域网内使用 1、物理上处于统一局域网 同一公司的网络同一家庭的网络连接同一手机热点的主机 2、逻辑上处于同一局域网 直接可以ping对方主机&#xff08;能够直接访问到&#xff09; 二、共享权限 1、共享权限 一般设置为everyone完全控制 2、NTF…

使用连接池对于feign的远程调用的优化

Feign底层发起http请求时&#xff0c;默认使用URLConnection发起http请求&#xff0c;不支持连接池操作&#xff0c;那么为了提高Feign的性能&#xff0c;可以采用的手段是使用连接池代替默认的URLConnection 支持连接池的http客户端 Apache HttpClientOKHttp本示例采用的是Apa…

continue语句

continue结束本次循环&#xff0c;接着判断下一次是否循环&#xff0c;我们上实例&#xff0c;用代码去理解continue 我们观察这个代码&#xff0c;会发现代码并没有终止运行&#xff0c;仅仅是把符合n%3的结果忽略掉了&#xff0c;后面的照常进行&#xff0c;直到for整个循环…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布

目录 一、实验 1.蓝绿发布准备 2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布 二、问题 1.手动构建Jenkins前端项目CI流水线报错 2.如何优化手动构建流水线选项参数 一、实验 1.蓝绿发布准备 &#xff08;1&#xff09;环境 表1 蓝绿发布…

python下载安装教程3.10.0,python下载安装教程3.9.7

这篇文章主要介绍了python下载安装教程3.10.0&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 前言 1、下载python 下载地址&#xff1a;https://www.python.org/&#xff0c;点…

NVIDIA A100 PCIE 40GB k8s-device-plugin install in kubernetes

文章目录 1. 目标2. 简介2.1 英伟达 A100 技术规格2.2 架构优势2.3 显卡跑分对比2.4 英伟达 A100 与 kubernetes 3. 安装 NVIDIA A100 GPU 40G 硬件4. NVIDIA R450 datacenter driver5. NVIDIA Container Toolkit6. 创建 runtimeclass5. MIG Strategies6. 配置仓库7. 下载镜像8…

千梦网创:逮住一闪而过的机会疯狂摩擦

我这个人平时想的就多&#xff0c;睡觉也在想事情&#xff0c;有时候睡觉里想的事情往往都是很纯粹的、很绝妙的&#xff0c;但是经常性一醒过来就忘了&#xff0c;再去回忆怎么也想不起来了。 灵感只在特定的环境下产生&#xff0c;这类环境是不可再生和模拟的。 机会只因特…

ArkTS的Watch装饰器

Watch装饰器&#xff0c;相当于Vue中的监听器 以及 React中使用useEffect监听变量 使用Watch装饰器&#xff0c;可以监听一个数据的变化&#xff0c;并进行后续的响应。 使用方法&#xff1a; Watch(‘回调函数’)&#xff0c;写在State装饰器后&#xff08;其实写在前面也行&a…

数据结构之---- 回溯算法

数据结构之---- 回溯算法 什么是回溯算法&#xff1f; 回溯算法是一种通过穷举来解决问题的方法&#xff0c;它的核心思想是从一个初始状态出发&#xff0c;暴力搜索所有可能的解决方案&#xff0c;当遇到正确的解则将其记录&#xff0c;直到找到解或者尝试了所有可能的选择都…

算法训练第三十九天|62. 不同路径、63. 不同路径 II

62. 不同路径&#xff1a; 题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有…

Slate基础使用说明

目录 Slate基础使用说明 1. 简单教程 2. 要点说明 2.1 TCommands以及TCommands基类 2.2 FUICommandInfo 2.3 FUICommandList 2.4 FUIAction 2.5 UICommand 3. 代码源码 4. 工具使用 4.1 Display Ul Extension Points 4. 参考文章 Slate基础使用说明 1.…

TCP/IP详解——HTTPS 协议

文章目录 1. HTTPS 协议1.1 HTTPS 原理1.2 HTTPS 过程1.3 从数据包角度看 HTTPS 交互过程1.4 常见的 HTTPS 数据包解码1.4.1 ClientHello 数据包1.4.2 ServerHello 数据包 1.5 思考 1. HTTPS 协议 1.1 HTTPS 原理 HTTPS概念 HTTPS 是以安全为目标的HTTP通道&#xff0c;并不…

在线弹钢琴网站源码,带练习教学和推销乐谱功能

源码介绍 AutoPiano-在线弹钢琴网站源码&#xff0c;在线钢琴模拟器&#xff0c;自由在线弹奏虚拟钢琴&#xff0c;是所有人的绝佳音乐平台。 背景图片在./static/images, 另外需要在js内的0.7fc8a67cbbcb823cf89e.js和1.f9a3f1dba143d1b59ca4.js修改图片对应路径。 钢琴声…

Docker 部署 Lobe Chat 服务

拉取最新版本的 Lobe Chat 镜像&#xff1a; $ sudo docker pull lobehub/lobe-chat:latest使用以下命令来运行 Lobe Chat 容器: $ sudo docker run -d --name lobe-chat -p 10084:3210 -e OPENAI_API_KEYsk-xxxx -e OPENAI_PROXY_URLhttps://api.openai.com/v1 -e ACCESS_CO…

《Linux C编程实战》笔记:实现自己的ls命令

关键函数的功能及说明 1.void display_attribute(struct stat buf,char *name) 函数功能&#xff1a;打印文件名为name的文件信息&#xff0c;如 含义分别为&#xff1a;文件的类型和访问权限&#xff0c;文件的链接数&#xff0c;文件的所有者&#xff0c;文件所有者所属的组…

2023年【公路水运工程施工企业安全生产管理人员】考试总结及公路水运工程施工企业安全生产管理人员试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 公路水运工程施工企业安全生产管理人员考试总结根据新公路水运工程施工企业安全生产管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将公路水运工程施工企业安全生产管理人员模拟考试试题进行汇编&#xff0…

PCL点云处理之自定义生成多种类型的圆柱点云(C++)(二百二十五)

PCL点云处理之自定义生成多种类型的圆柱点云(C++)(二百二十五) 一、算法介绍1.空心圆柱点云2.实心圆柱点云二、算法实现1.生成方法1(空心)2.生成方法2(实心)一、算法介绍 根据自己指定的圆柱长度、圆柱半径、以及中心轴的方向,生成一个圆柱点云数据,保存在PCD文件中…

c#可变参数(params)关键字

通过使用 params 关键字&#xff0c;可以指定采用可变数量参数的方法参数。 可以发送参数声明中指定类型的参数的逗号分隔列表&#xff0c;也可以发送指定类型的参数数组。您也可以不发送任何参数。如果未发送任何参数&#xff0c;则参数列表的长度为零。 方法声明中的 param…

Anaconda中使用Jupyter出现’No module named ‘pymysql‘问题解决

问题截图&#xff1a; 解决办法&#xff1a; 一.找到Anaconda所在文件夹&#xff0c;文件夹处输入 cmd 进入命令控制 二. 在打开的cmd中输入‘conda install pymysql’ 三、输入y 安装完成~ 测试&#xff1a; import pandas as pd from sqlalchemy import create_engine …