Shiro的过滤链设计机制?

首先,还是先给出SpringShiroFilter的继承结构,如下图:

既然是过滤器,那么一定是有一个doFilter方法供Servlet容器调用(如tomcat),,SpringShiroFilter中没有这个方法,我们一层一层的的往上找,直到在OncePerRequestFilter中找到该方法

这里会调用到125行的doFilterInternal()方法,该方法是个抽象方法,那么查看他的子类AbstractShiroFilter。在第356-359行对request和response进行了处理,以及创建了一个Subject。这里本篇文章不讲述其中的过程。后面会出专门的文章讲述。主要涉及到脱离容器的session实现以及Subject的创建。关注到362行,这里匿名实现了一个callable接口,最终调用到365行的excuteChain(),这是整个SpringShiroFilter的核心所在

这里的逻辑是获取一个可执行的过滤链,并调用其doFilter()方法触发下一个过滤器往下执行。getExecutionChain()方法进一步点进去,这里第一步409行获得初始化时注入的FilterChainResolver,第二步415行通过这个解析器获得初始化时配置好的过滤链 点进415行获取过滤链的具体方法,第一步,获取到请求的URI,第二步,将URI与xml中配置的URL进行逐个比对,第三步对这个匹配的过滤器进行代理(这个很重要)并返回

细看第二步,点进比对方法,这里把它委托给了初始化时默认的AntPathMarcher,最终实现比较逻辑的是doMatch方法。(所以我们以后要实现shiro兼容restFul路径时应该要重新的就是这个类的该方法,并注入到FilterChainResolver)

回到第三步,点进111行的proxy()方法

继续点进proxy()方法

这里返回了一个被包装了的FilterChain,看看他的doFilter方法。(注释翻译:如果封装好的chain到了末端,那么开始调用原生的过滤链)。所以这里会将shiro的过滤链先调用完,再执行javaEE规范的过滤链。

现在完成了最重要的一步,将FilterChain进行了代理,下面一路回退,回退到最开始的executerChain()方法,在得到这个代理过滤链后直接调用doFilter方法触发我们配置的具体过滤器。

自此,SpringShiroFilter完成了他的使命--通过组合的方式将shiroFilterChian添加到FilterChian中,所以一旦经过经过了这个过滤器,那么我们的filterChain可就不是原来的filterChain了,shiro通过组合的设计模式对doFilter()方法的具体实现修改了,并且丝毫不影响客户端调用代码,甚至都感知不到原来这个FilterChain已经被shiro"无耻"的篡改了。

本篇文章讲了SpringShiroFilter将ShiroFilterChain加载到FilterChain的实现原理,下一篇文章将以PermissionsAuthorizationFilter为例讲解具体的ShiroFilter过滤的步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值