文章目录

  • 获取Subject
  • 猜想
  • 源码分析
  • ThreadContext是什么时候跟Subject绑定的呢?
  • 猜想ThreadLocal是跟当前线程绑定的,如果我springmvc里面使用异步方法执行,在异步处理过程中能获取到subject吗?
  • 验证:

获取Subject

使用shiro获取Subject的方法:

            Subject subject = SecurityUtils.getSubject();

为什么,不管在哪通过SecurityUtils获取的Subject 都是同一个呢?
而且Subject 里面还有用户的信息.

猜想

首先,能在各个地方获取Subject 只有一种办法,就是通过ThreadLocal类来实现,那么SecurityUtils肯定维护了一个ThreadLocal.

源码分析

首先看getSubject方法:

点到ThreadContext类:

说明是ThreadContext类维护了一个ThreadLocal;

ThreadContext是什么时候跟Subject绑定的呢?

我们发现有个方法:bind(Subject subject),
看谁掉了这个方法:


是SubjectCallable里面就开始绑定了,我们只要看是谁新建了SubjectCallable这个类就好了,发现在Subject里面执行execute的时候新建的,同时将subject也就是this传进去了.

现在明了了,上篇讲到subject创建详解
里面有一张图:

在创建了subject的时候就通过execute来执行过滤器链的方法,这时候将创建好的subject跟ThreadContext进行了绑定,所以我们在任何地方都可以通过SecurityUtils.getSubject()来获取Subject.

猜想ThreadLocal是跟当前线程绑定的,如果我springmvc里面使用异步方法执行,在异步处理过程中能获取到subject吗?

是可以的,我们看ThreadContext里的的ThreadLocal具体实现就知道了:

主要功劳就是InheritableThreadLocal实现,这个实现大概做的事情就是如果父线程里面使用ThreadLocal了,然后在父线程里面又创建子线程,这是会将父线程的ThreadLocal拷贝到子线程里面,所以在异步线程里面是可以获取到subject的.
这时候就会想如果是异步线程池呢,这一块比较复杂,因为
InheritableThreadLocal实现的时候,如果是异步线程池,在一开始设置了ThreadLocal,他是有缓存的,详情见:解决父子线程ThreadLocal中的缓存问题

验证:

通过SecurityUtils获取Subject详解相关推荐

  1. php 获取流文件大小,php获取文件大小详解

    本文主要和大家分享php获取文件大小详解,希望能帮助到大家. 通过filesize函数可以取得文件的大小,文件大小是以字节数表示的.$filename = '/data/webroot/usercod ...

  2. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解

    荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...

  3. 猛兽之地服务器维护,猛兽之地Roguelands全材料获取途径详解

    以下就是小编为大家带来的猛兽之地Roguelands全材料获取途径详解: 蘑菇镇主要产出: 发光蘑菇 屎壳螂 少量怪兽抓 古老废墟主要产出: 甲壳碎片 辛辣种子 星空岩 折磨大陆主要产出: 星之果 少 ...

  4. 妖怪手帐获取服务器信息失败,妖怪手帐妖怪全获取途径详解分享

    妖怪手帐妖怪怎么获得?游戏中小伙伴们需要操控妖怪来完成副本等操作,妖怪是小伙伴们的伙伴.那么如何获得妖怪呢?有哪些获取的方法途径?下面是小编带来的攻略解析,一起来关注下哦! 主要妖怪来源途径: 分为玉 ...

  5. 魅蓝e android版本,魅蓝E怎么刷机 root权限获取教程详解

    魅蓝E怎么刷机 root权限获取教程详解 来源:www.18183.com作者:雾里看海时间:2016-08-15 魅蓝E怎么刷机?这边有几个步骤,大家别遗漏了哦,下面小编具体给大家讲讲魅蓝E怎么刷机 ...

  6. 超级跑跑服务器维修,梦幻西游手游神兽超级跑跑如何获取 超级泡泡获取方法详解...

    梦幻西游手游最新价增加了新的神兽超级泡泡,有着超强的实力与超萌外表,成为许多玩家的追求,那么超级泡泡该如何获取呢,有什么方法呢,下面一起来看看吧. 一,兑换法 简单来说想要获得超级泡泡最直接快速的方法 ...

  7. 真实场景的双目立体匹配(Stereo Matching)获取深度图详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右 ...

  8. Android 手机设备信息获取使用详解

    Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...

  9. 烟雨江湖小米鸿蒙,烟雨江湖小米时装怎么拿? 小米衣服获取方法详解[多图]

    烟雨江湖小米衣服是小米渠道服的专属奖励哦,虽然外表看起来朴朴素素的,但是免费奖励谁都喜欢拿,下面手游汇大大就带来详细内容,快来看看吧~ 烟雨江湖小米衣服获取方法 烟雨江湖小米衣服怎么得? 小米上线邮箱 ...

  10. 百度地图安卓版详细接入流程解读(获取密钥详解)

    百度地图安卓版详细接入流程解读 一.接入Android地图SDK 1.1 功能介绍: 1.2 接入百度地图前的准备 1.1.1 访问官网,并下载开发包 1.1.2 获取开发密钥 1.1.3 项目环境搭 ...

最新文章

  1. 分表后需要注意的那些事儿
  2. 与WebXR共同创建者Diego Marcos一起探讨沉浸式Web的未来(上)
  3. 真格量化——50etf与期权对冲策略
  4. 反射 字段_java核心基础之反射
  5. dlut-KFQ人工智能导论答案1
  6. python,进程和线程
  7. XML编程总结(七)——使用XPath对象查询xml文档
  8. Socket即时通讯
  9. linux shell ps kill 某个名字的所有进程
  10. Java核心技术(基础知识一)
  11. [经验教程]Windows电脑上查看ip地址的cmd命令是什么及如何利用CMD查看本机IP地址?
  12. linux iozone测试工具,IOZONE测试工具使用方法
  13. protected 修饰符的使用
  14. 一、学习Lua 教程
  15. JZOJ 1403.渡河
  16. 逆向之OllyDbg调试细则
  17. FPGA 任意分频器设计
  18. 千亿流量拦截控制处理技术-Nginx(安装 命令 路由匹配 负载均衡 常用配置)
  19. 化繁为简,这家企业如何撬动千亿美元物联网服务大市场
  20. 源代码安装paddlepaddle 到云计算机——感谢百度云和人工智能项目paddlepaddle

热门文章

  1. win7默认网关不可用_win7 默认网关不可用
  2. 四月,诗月,你是最美人间四月天。
  3. 初学python数据结构-切片
  4. python获取上周一的日期
  5. Gitee 多人协作开发教程
  6. python中的各类除法总结
  7. WPF设置当前激活窗体(前景窗体)
  8. Simulink学习案例2
  9. R语言基础—学习笔记 lecture01
  10. 在React项目中引入字体文件并使用