通过SecurityUtils获取Subject详解
文章目录
- 获取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详解相关推荐
- php 获取流文件大小,php获取文件大小详解
本文主要和大家分享php获取文件大小详解,希望能帮助到大家. 通过filesize函数可以取得文件的大小,文件大小是以字节数表示的.$filename = '/data/webroot/usercod ...
- 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解
荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...
- 猛兽之地服务器维护,猛兽之地Roguelands全材料获取途径详解
以下就是小编为大家带来的猛兽之地Roguelands全材料获取途径详解: 蘑菇镇主要产出: 发光蘑菇 屎壳螂 少量怪兽抓 古老废墟主要产出: 甲壳碎片 辛辣种子 星空岩 折磨大陆主要产出: 星之果 少 ...
- 妖怪手帐获取服务器信息失败,妖怪手帐妖怪全获取途径详解分享
妖怪手帐妖怪怎么获得?游戏中小伙伴们需要操控妖怪来完成副本等操作,妖怪是小伙伴们的伙伴.那么如何获得妖怪呢?有哪些获取的方法途径?下面是小编带来的攻略解析,一起来关注下哦! 主要妖怪来源途径: 分为玉 ...
- 魅蓝e android版本,魅蓝E怎么刷机 root权限获取教程详解
魅蓝E怎么刷机 root权限获取教程详解 来源:www.18183.com作者:雾里看海时间:2016-08-15 魅蓝E怎么刷机?这边有几个步骤,大家别遗漏了哦,下面小编具体给大家讲讲魅蓝E怎么刷机 ...
- 超级跑跑服务器维修,梦幻西游手游神兽超级跑跑如何获取 超级泡泡获取方法详解...
梦幻西游手游最新价增加了新的神兽超级泡泡,有着超强的实力与超萌外表,成为许多玩家的追求,那么超级泡泡该如何获取呢,有什么方法呢,下面一起来看看吧. 一,兑换法 简单来说想要获得超级泡泡最直接快速的方法 ...
- 真实场景的双目立体匹配(Stereo Matching)获取深度图详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右 ...
- Android 手机设备信息获取使用详解
Android 手机是我们常用的工具之一,买手机之前,手机厂商会提供一些手机参数给我们,那么问题来了,我们该如何获取手机上的参数信息呢? 通过本文你讲了解到获取手机常用信息的基本方法. 获取手机基本信 ...
- 烟雨江湖小米鸿蒙,烟雨江湖小米时装怎么拿? 小米衣服获取方法详解[多图]
烟雨江湖小米衣服是小米渠道服的专属奖励哦,虽然外表看起来朴朴素素的,但是免费奖励谁都喜欢拿,下面手游汇大大就带来详细内容,快来看看吧~ 烟雨江湖小米衣服获取方法 烟雨江湖小米衣服怎么得? 小米上线邮箱 ...
- 百度地图安卓版详细接入流程解读(获取密钥详解)
百度地图安卓版详细接入流程解读 一.接入Android地图SDK 1.1 功能介绍: 1.2 接入百度地图前的准备 1.1.1 访问官网,并下载开发包 1.1.2 获取开发密钥 1.1.3 项目环境搭 ...
最新文章
- 分表后需要注意的那些事儿
- 与WebXR共同创建者Diego Marcos一起探讨沉浸式Web的未来(上)
- 真格量化——50etf与期权对冲策略
- 反射 字段_java核心基础之反射
- dlut-KFQ人工智能导论答案1
- python,进程和线程
- XML编程总结(七)——使用XPath对象查询xml文档
- Socket即时通讯
- linux shell ps kill 某个名字的所有进程
- Java核心技术(基础知识一)
- [经验教程]Windows电脑上查看ip地址的cmd命令是什么及如何利用CMD查看本机IP地址?
- linux iozone测试工具,IOZONE测试工具使用方法
- protected 修饰符的使用
- 一、学习Lua 教程
- JZOJ 1403.渡河
- 逆向之OllyDbg调试细则
- FPGA 任意分频器设计
- 千亿流量拦截控制处理技术-Nginx(安装 命令 路由匹配 负载均衡 常用配置)
- 化繁为简,这家企业如何撬动千亿美元物联网服务大市场
- 源代码安装paddlepaddle 到云计算机——感谢百度云和人工智能项目paddlepaddle