这次,我们来看看shiro的subject创建和session的创建。
真正执行过滤器的filter是SpringShiroFilter。SpringShiroFilter是ShiroFilterFactoryBean的内部类。
过滤器拦截匹配的url后,进入到doFilter()方法。这里看OncePerRequestFilter类中的doFilter()方法。
看doFilterInternal()这里是抽象方法,在AbstractShiroFilter这个类中有具体实现。在此方法中createSubject()方法中,创建了subject。在execute()方法中,另起一个线程将subject绑定到ThreadLocal线程上。这些绑定,解绑的操作都由ThreadContext这个对象来完成。事实上,绑定在ThreadLocal上的是一个Map<Object,Object>对象,map里面放的就是subject和securityManager。
进入到execute()方法里面看看。在execute()方法上,使用 lambda表达式申明一个匿名内部类,作为型参传递到方法里面。然后通过associateWith(callable)方法构造一个SubjectCallable对象。然后在execute()方法里面执行call方法,另起一个线程执行。
这样另起一个线程就会执行SubjectCallable对象的call()方法。在call()方法里面调用threadState.bind()绑定subject,然后在执行匿名内部类的call()方法。