接上篇,上篇说到AbstractShiroFilter中的doFilterInternal主要做了创建subject和过滤链,上篇已经说了创建subject的过程,这篇说说创建过滤链的过程。
主要是executeChain这个方法了,看名字是执行链,实际上是执行servlet的过滤链来生成shiro的过滤链,来看一下它的具体实现。进到具体的实现里可以发现,只有两行代码,得到过滤链,执行过滤链。然后来看一下获取过滤链的过程。
主要是两句,获取过滤链解析器和从解析器中获取过滤链。
重点是这个解析器,这个对象里面有一个filterChainManager对象,这个对象里面有我们配置的请求路径和对应的过滤器,还有11个shiro默认的过滤器,还有一些过滤器配置对象。另外还有一个pathMatcher对象,这个对象的主要作用是匹配请求路径和我们配置的路径,然后找到对应的过滤器。
resolver.getChain这个方法里面的逻辑很简单,就是循环上面我们配置的filterChains,然后找到与这次请求想匹配的过滤器。当然,你可以重写匹配的方法,如果你感到开心的话。
到这里shiro的过滤链就完成创建了。回到上面,当执行chain.doFilter时,又会回到OncePerRequestFilter的doFilter方法中,这个时候,就才真正进入到shiro的过滤器中。