5.shiro源码分析之shiro的启动过程

  • 概述
    通过分析shiro的启动过程,有利于大家理解为什么在使用前要添加一些配置,为什么要这样配置才能起效,阅读这个章节,将会明白为什么.

  • DelegatingFilterProxy(拦截器)
    DelegatingFilterProxy是我们配置的一个拦截器,对于了解servlet过三大组件或者说做web开发的同学都是知道的,这里DelegatingFilterProxy是一个拦截器,我们知道拦截器就是用来拦截请求的,至于拦截哪些请求,得看我们配置的路径模式了,这个配置是在web.xml中配置的,并且大家都喜欢把过滤器名称设置为shiroFilter,这里我是使用实现ServletContainerInitializer方式(java配置方式)配置,大家使用xml方式配置是一样的。如下:
    在这里插入图片描述

  • ShiroFilterFactoryBean(FactoryBean)
    我们知道,配置完DelegatingFilterProxy,我们还需要配置一个ShiroFilterFactoryBean,并且这个factory的bean的名称还一定要是叫做shiroFilter,毫无疑问,这肯定和上面配置的DelegatingFilterProxy有关。配置如下
    在这里插入图片描述

  • ShiroFilterFactoryBean S p r i n g S h i r o F i l t e r d e b u g d o F i l t e r S h i r o F i l t e r F a c t o r y B e a n SpringShiroFilter(拦截器) 其实debug过的人都知道,最后一个请求过来之后,会调用拦截器的doFilter方法,其实最后来处理这些请求的拦截器,都是由ShiroFilterFactoryBean SpringShiroFilter来处理的,DelegatingFilterProxy只是一个代理拦截器,被代理的拦截器是ShiroFilterFactoryBean$SpringShiroFilter。那我我们来看看吧
    在这里插入图片描述
    首先是经过DelegatingFilterProxy这个拦截器,调用doFilter方法进行处理
    在这里插入图片描述
    在DelegatingFilterProxy的doFilter方法中会调用invokeDelegate方法,在invokeDelegate方法内部就开始把请求委托给SpringShiroFilter的dofilter来处理了.

  • 为什么配置的filter的名称要相同?
    这个问题其实就是说明DelegatingFilterProxy和ShiroFilterFactoryBean有什么关系,是怎样关联的了,其实很简单,这个关系肯定是在DelegatingFilterProxy初始化的时候确定的,我们可以看看init方法
    在这里插入图片描述
    在init方法中有一个initFilterBean方法,也就是来初始化DelegatingFilterProxy的一些属性值,被代理的Filter就是他的一个属性
    在这里插入图片描述
    可以看到,第一步先获取ico容器,第二步才是为代理过滤器(SpringShiroFilter)赋值
    在这里插入图片描述
    是不是会从ico容器中获取一个TageName的Bean,然后赋值给delegate(代理过滤器)。这个TagName就是我们在配置DelegatingFilterProxy的filterName,如下的构造方法:
    在这里插入图片描述
    现在应该清楚了吧,最后会把ShiroFilterFactoryBean这个对象赋值给delegate(代理过滤器),很多人可能会有疑问,我刚刚看到的明明是ShiroFilterFactoryBean$SpringShiroFilter这种类型的过滤器,这是因为ShiroFilterFactoryBean是一个工厂bean,有spring基础的都应该知道,如果配置了一个bean工厂,最后返回的类型是看Bean工厂的getObject类型来定的
    在这里插入图片描述
    在这里插入图片描述
    现在应该清楚了吧,ShiroFilterFactoryBean的getObject方法内部调用createInstance方法,最后返回了ShiroFilterFactoryBean的内部类SpringShiroFilter类型,这也就是为什么DelegatingFilterProxy内部委托给的过滤器是ShiroFilterFactoryBean的内部类SpringShiroFilter类型了,这也是为什么filter名称要和ShiroFilterFactoryBean的bean的名称一样的原因了。

  • 总结
    我想现在大家了解了shiro启动过程,能够明白开始的那些疑问了。

发布了65 篇原创文章 · 获赞 11 · 访问量 7153

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/95936994