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

浅谈一下@Async和SpringSecurityContext可能会遇到的问题和解决方案

Async和SpringSecurityContext

场景回溯

在执行一个用时较长的批量插入业务的时候,我尝试使用@Async异步对业务进行优化,但是却给我报了空指针的错误,定位之后发现

image-20230531185851242

此处我是基于SpringSecurity来获取用户的

image-20230531190558107

是currentUserService获取到的当前登陆用户为空导致的,但是当前确实是处于登陆状态的

然后,我删除了业务方法上的@Async注解,这个方法执行了20s但是没有出现报错

由此可以确定是异步导致的错误

错误原因

SecurityContextHolder的底层默认是基于ThreadLocal的,

image-20230531190351672

image-20230531190405072

基于ThreadLocal就会导致异步执行的子线程拿不到主线程的ThreadLocal,从而导致SecurityContext中没有用户信息;

解决方式

既然子线程没有拿到父线程的ThreadLocal那就让他拿到不就好了,那我们该如何拿到呢?

InheritableThreadLocal是Java中的一个类,它提供了类似于ThreadLocal的功能,但具有额外的特性。它允许在ThreadLocal中存储的值在创建子线程时被子线程继承。

那我们如何让SecurityContext底层使用InheritableThreadLocal呢?

SpringSecurity贴心的为我们设计了基于InheritableThreadLocal的SecurityContext策略

并且在SecurityContextHolder中已经给出了对应的配置项

image-20230531191642594

我们只需要进行相应的配置即可

    public static void main(String[] args) {SpringApplication.run(LabourServiceApplication.class,args);//配置基于InheritableThreadLocal的SecurityContextSecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);}
http://www.lryc.cn/news/89795.html

相关文章:

  • VUE常见面试题
  • 字符串匹配算法--KMP算法--BM算法
  • swagger的简单介绍
  • HNU-电路与电子学-小班3
  • [机缘参悟-98] :层次不同、维度不同、视角不同、结论不同
  • chatgpt-web发布之docker打包流程
  • 动态优化会议地点
  • Golang每日一练(leetDay0076) 第k大元素、组合总和III
  • 可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用
  • Java并发常见面试题
  • 基于vue3+pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面
  • JDK动态代理和CGLIB动态代理
  • Jetpack Hilt 框架的基本使用
  • exec()在不同namespace执行结果的区别
  • 人工智能革命中的22个隐藏职业:推动科技行业的变革
  • 算法题3 — 求字符串中的最长子串
  • 【FreeRTOS】——中断优先级设置中断相关寄存器临界段代码保护调度器挂起与恢复
  • 1.2 什么是eBPF?(下)
  • 掌握哪些测试技术才能说自己已经学成了?
  • 什么是C语言?
  • SAP-物料主数据-质量管理视图字段解析
  • TOP RPA·脱普×实在丨日用品企业脱普签约实在智能,构建全域数据智能运营系统
  • 【Android】Handler(四)Looper的相关知识点
  • Redis缓存雪崩及解决办法
  • Maven私服仓库配置-Nexus详解
  • Systrace系列10 —— Binder 和锁竞争解读
  • React Hooks中使用useState异步回调获取不到最新值的问题
  • JavaScript 高级 (完结)
  • 【P30】JMeter 事务控制器(Transaction Controller)
  • 【MySQL】MySQL的事务原理和实现?