ThreadContext简单介绍

首先看下ThreadContext类的说明:

 

1、shirofilter会为当前线程创建subject

              内置ThreadLocal

 

从之前的源码中我们知道了每一次访问都会重新建立subject然后绑定到当前线程,所以这个就很简单了,因为当前线程中获得subject不会是null。只有在没有配置shirofilter的应用中才会出现当前线程中subject==null的情况。

同样的情况适用于securityManager,也是从当前线程中获取。securityManager是在绑定subejct到当前线程的时候顺便绑定的,以为securityManager是构成subject的元素之一。

 

ThreadContext类通过key/value键值对为每一个线程提供绑定及解绑对象的方法。如果使用了如线程池这样的技术并且不希望共享数据,那么在使用ThreadContext的开始和结束阶段都需清除数据。

 

shiro中基本所有的都是如下的key保存值:

private static final ThreadLocal<Map<Object, Object>> resources = new InheritableThreadLocalMap<Map<Object, Object>>();

 

private static final Logger log = LoggerFactory.getLogger(ThreadContext.class);

public static final String SECURITY_MANAGER_KEY = ThreadContext.class.getName() + "_SECURITY_MANAGER_KEY"; public static final String SUBJECT_KEY = ThreadContext.class.getName() + "_SUBJECT_KEY";

 

 

ThreadContext的静态变量共有四个,

第一个用于记录日志;

第二个SECURITY_MANAGER_KEY是用来表示SecurityManager对象对应的key,

SUBJECT_KEY则是表示Subject对象对应的key,

这里是通过反射来定义这两个key的值。

最后一个resources对象实际上就是一个ThreadLocal。通过这四行代码我们大致可以了解ThreadContext类的作用。ThreadContext的作用其实就是通过每个线程的ThreadLocalMap来存储线程自己的SecurityManager对象以及Subject对象,因为用到了ThreadLocal因此这里的操作都是线程安全地。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值