首页 > 其他分享 >【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇

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

时间:2023-12-25 13:00:53浏览次数:37  
标签:hasDataViewRole Web shareData SaTokenException threadLocal 线程 实操 new ThreadShare

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


在上一篇《【理论篇】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();
}






标签:hasDataViewRole,Web,shareData,SaTokenException,threadLocal,线程,实操,new,ThreadShare
From: https://blog.51cto.com/kaigejava/8967035

相关文章

  • Web.Config文件详解
    一).Web.Config是以XML文件规范存储,配置文件分为以下格式    1.配置节处理程序声明      特点:位于配置文件的顶部,包含在<configSections>标志中。    2.特定应用程序配置      特点:  位于<appSetting>中。可以定义应用程序的全局常量设置等信息.    ......
  • WebAPP 钢琴小网站
    其实插件到底做成啥样的我自己还没想好。 先以这个为范本。  网站地址https://www.autopiano.cn/midi/46812212798731 ShoelessCai.com打算开发怎样的音乐接口呢? 还在想! 其实,无论是创业,还是写代码,还要考虑收入及现金流问题,压力肯定是很大的。于是,你还要顾虑文......
  • JavaWebDay4
    一:maven什么是maven:maven是apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具maven的作用:MAVEN项目的目录配置maven的环境的两种方法 导入meaven所写的exclusion应该在不想间接依赖的外面级写,比如a依赖b,b依赖c,那么不想要c的时候则在写依赖b的后面写ex......
  • ChatGPT对话为什么不用WebSocket而使用EventSource?
    文章目录1.引言2.WebSocket和EventSource简介2.1WebSocket2.2EventSource3.ChatGPT对话系统的特点4.EventSource的优势4.1简单易用4.2容错性强4.3兼容性良好5.为何选择EventSource而非WebSocket?5.1单向通信模式5.2长轮询模式5.3简化部署和维护6.使用EventSource的代......
  • Python从入门到实践project Web 应⽤程序 Django ⼊门.2
    projectWeb应⽤程序Django⼊门1.创建网页:学习笔记主页2.创建其他网页创建网页:学习笔记主页映射URLfromdjango.urlsimportpath,includepath('',include('learning_logs.urls')),"""定义learning_logs的URL模式"""fromdjango.urlsimportpath......
  • 哥斯拉又一个webshell利器
    哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器,这里就不过多介绍了。GitHub地址:https://github.com/BeichenDream/Godzilla很多一线师傅不太了解其中的加解密手法,无法进行解密,这篇文章介绍了解密的方式方法,主要补全了网上缺少的ASP流量分析、PHP解密脚本和C#解密脚本。运行......
  • Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
    学习基础知识掌握Go语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解Go基础知识的好起点是查阅Go官方文档文章链接:Go编程语言详解:用途、特性、与Python和C++的比较基本语法了解Go语言的基本语法,包括Go程序的执行方式、包引入、主函数等Go......
  • Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
    学习基础知识掌握Go语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解Go基础知识的好起点是查阅Go官方文档文章链接:Go编程语言详解:用途、特性、与Python和C++的比较基本语法了解Go语言的基本语法,包括Go程序的执行方式、包引入、主函数等Go......
  • Web3公开课-第一讲
    Web3公开课-第一讲什么是Web3?Web1:用户只能在Web1的网站上单纯的获取信息,不可以上传自己的数据,网站没有交互效果,只是一堆信息的聚合。Web2:用户在Web2的网站或应用上可以读/写/进行交互,数据(私人信息)存储在中心化的服务器(可能会遭受到他人的审查)(例如:twitter等)。Web3:可拥有,例如以......
  • Web入门
    爆破一、ctf.showweb21穷举--base64解码登录使用BP抓包如下图所示,发送到拦截器里标记选择Payloads,Payloads类型选择自定义迭代该变红框的值进行多次值设置,本次需要进行三次设置,分别为账号冒号密码Position为1导入字典Position选择2写入:8.Position选择3导......