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

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

时间:2023-12-16 22:05:01浏览次数:27  
标签:Web 自定义 SaTokenException 局部变量 Request 认证 Token 线程 SA

在我们使用sa-token安全框架的时候,有时候会提示:SaTokenException:非Web上下文无法获取Request

错误截图:

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇_局部变量

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇_自定义_02

在官方网站中,查看常见问题排查:

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇_局部变量_03

错误追踪:

跟着源码可以看到如下代码:

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇_子线程_04

从源码中,我们可以看到,由于非Web上下文中无法直接获取HttpServletRequest对象,因此无法直接在子线程中使用SA-Token认证框架中的Web相关功能。

知道了问题原因所在,接下来,我们就来解决:

解决方案一:


  1. 提取SA-Token信息:从请求中提取SA-Token信息,并将其传递给子线程。您可以在主线程中解析请求参数或读取请求头,获取SA-Token,并将其传递给子线程。
  2. 使用线程局部变量:将SA-Token存储在线程局部变量中,以便子线程可以访问它。在主线程中,您可以将SA-Token存储在线程局部变量中,并在子线程中使用该变量来获取SA-Token。
  3. 自定义认证逻辑:在子线程中编写自定义的认证逻辑,以处理SA-Token的验证和其他相关操作。您可以使用现有的安全框架或库提供的功能,如加密算法、签名验证等,来进行认证。

以下是一个简单的示例代码,演示了如何在子线程中使用自定义认证逻辑来处理SA-Token:

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class SaTokenAuthentication {  
    private static final ExecutorService executor = Executors.newSingleThreadExecutor();  
  
    public static void main(String[] args) {  
        // 模拟从请求中提取的SA-Token信息  
        String saToken = "your_sa_token";  
  
        // 提交给子线程执行的任务  
        executor.submit(() -> {  
            // 在子线程中进行自定义认证逻辑  
            boolean isAuthenticated = authenticate(saToken);  
  
            // 根据认证结果执行相应的操作  
            if (isAuthenticated) {  
                // 认证成功,执行其他操作...  
            } else {  
                // 认证失败,处理错误...  
            }  
        });  
    }  
  
    private static boolean authenticate(String saToken) {  
        // 在这里编写自定义的认证逻辑,以验证SA-Token的有效性和完整性等。  
        // 您可以使用现有的安全框架或库提供的功能来进行认证。  
        // 这里只是简单地模拟认证过程并返回结果。  
        return saToken.equals("valid_sa_token"; // 替换为您的验证逻辑  
    }  
}

解决方案二:


解决方法比较简单:

1、参数透传

修改接口,把需要在ThreadLocal中获取的参数透传到其它方法中。

解决方案:先获取你想要的值,再把这个值当做一个参数传递到这些方法中,而不是直接从方法内调用Sa-Token的APl。

2、重置上下文对象

在子线程中重置RequestContextHolder对象。

// 从主线程获取用户数据 放到局部变量中
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> testFuture = CompletableFuture.runAsync(() -> {
    // 把旧RequestAttributes放到新线程的RequestContextHolder中
    RequestContextHolder.setRequestAttributes(attributes);
    ...
    }

 使用方式1 测试了下,发现问题圆满解决。

示意图:

【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇_自定义_05

总结:

 因为异步的原因,他会丢掉ThreadLocal中原来线程的数据,从而获取不到loginUser,这种情况下我们可以在方法内的局部变量中先保存原来线程的信息,在异步编排的新线程中拿着局部变量的值重新设置到新线程中即可。


标签:Web,自定义,SaTokenException,局部变量,Request,认证,Token,线程,SA
From: https://blog.51cto.com/kaigejava/8854213

相关文章

  • 【Web攻防之业务安全实战指南】第8章 回退模块测试
    8.1回退测试8.1.1测试原理和方法很多Web业务在密码修改成功后或者订单付款成功后等业务模块,在返回上一步重新修改密码或者重新付款时存在重新设置密码或者付款的功能,这时如果能返回上一步重复操作,而且还能更改或者重置结果,则存在业务回退漏洞。8.1.2测试过程靶场:8_1.zip首先......
  • 【Web攻防之业务安全实战指南】第6章 业务授权访问模块
    6.1非授权访问测试6.1.1测试原理和方法非授权访问是指用户在没有通过认证授权的情况下能够直接访问需要通过认证才能访问到的页面或文本信息。可以尝试在登录某网站前台或后台之后,将相关的页面链接复制到其他浏览器或其他电脑上进行访问,观察是否能访问成功。6.1.2测试过程靶......
  • SCUCTF2023-WEB部分wp
    川大新生赛,出的确实有点水平的,通过一些渠道看了看题打了一些,有些地方还是值得学习学习的。不鸽了,先写点吧。因为他们是校园网访问,所以我这边也只能通过一些其他的方法去打,没截图....有附件能复现的尽量复现一下。主要看的是【Web】SCU新生赛个人wp及完赛感想-CSDN博客这篇blog......
  • JavaScript: WebGL3D
    fragment.bns 文件用NotePad打开 WebGL3D用tomcat浏览#version300esprecisionmediumpfloat;uniformfloatuR;invec3vPosition;//接收从顶点着色器过来的顶点位置invec4finalLight;//接受顶点着色器传过来的最终光照强度outvec4fragColor;voidmain(){......
  • 电脑时间不同步导致的上网报错:core/proxy/vmess/encoding: failed to read response h
    报错内容: 2023/12/1614:08:56[Warning][775541588]xxxxx.com/core/app/proxyman/outbound:failedtoprocessoutboundtraffic>xxxxx.com/core/proxy/vmess/outbound:connectionends>xxxxx.com/core/proxy/vmess/outbound:failedtoreadheader>xxxx......
  • 发现隐藏的 Web 应用程序漏洞
    随着Web2.0的扩展,近年来社交媒体平台、电子商务网站和电子邮件客户端充斥着互联网空间,Web应用程序已变得无处不在。国际知名网络安全专家、东方联盟创始人郭盛华透露:‘应用程序消耗和存储更加敏感和全面的数据,它们成为对攻击者更具吸引力的目标。“常见攻击方式该领域存......
  • HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。没有为请求的
    HTTP错误403.14-ForbiddenWeb服务器被配置为不列出此目录的内容。出现以上这个错误可能有如下解决方法:1.将应用程序池设置成V4.02.在配置文件中加上以下几句代码:<system.webServer><modulesrunAllManagedModulesForAllRequests=“true”/><directoryBrowseenabled=“......
  • 基于Web足球青训俱乐部管理后台系统-计算机毕业设计源码+LW文档
    摘要随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率,足球俱乐部管理后台系统应运而生。本文重点阐述了足球青训俱乐部管理后台系统的......
  • webview和h5通信
    有个需求是web-view嵌入h5页面,这时需要知道h5的路有变化,以下是一个简单的实现1.vue页面使用wx.miniProgram.postMessage发送消息beforeRouteLeave(to,from,next){wx.miniProgram.postMessage({data:{cardId:0,title:'电子名片'}......
  • Java Web开发阶段注解
    @Component标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean通过路径扫描来自动侦测以及自动装配到Spring容器中@Controller用于指示Spring类的实例是一个控制器,相对于实现Controller接口更加简单,使用Controller注解可以同时处理多个......