文章目录

  • 流程分析
  • 请求进来,生成subject然后执行过滤器
  • 代理过滤器,生成代理类,先执行shiro的过滤器然后执行Servlet
  • 获取解析器
  • 根据请求进行匹配
  • 生成代理其实就是ProxiedFilterChain:
  • 执行分析,shiro过滤器执行完,执行servlet过滤器
  • shiro的过滤器分析
  • 我们先看一下登录,登录是无需拦截的走的是anon;AnonymousFilter过滤器,内部几乎为空:
  • 鉴权过滤器
  • 然后返回会执行到Controller定义的方法


流程分析

前面讲了shiro的登录和spring整合的使用这里就使用简单的ssm项目来分析shiro的请求大致流程:

shiro流程分析_代理类

请求进来,生成subject然后执行过滤器

前面讲了subject的生成:

subject生成

shiro流程分析_spring整合_02


前面讲的是创建subject对象,现在来讲执行过滤器链;

代理过滤器,生成代理类,先执行shiro的过滤器然后执行Servlet

首先shiro直接将servlet原来过滤器放在一边,执行完shiro自己的过滤器才会执行原来的过滤器:

shiro流程分析_解析器_03

获取解析器

shiro流程分析_代理类_04

根据请求进行匹配

对请求的路径进行匹配,找到对应的过滤器,可以重写匹配方法,来实现restful风格的权限验证:

shiro流程分析_代理类_05

生成代理其实就是ProxiedFilterChain:

shiro流程分析_解析器_06


shiro流程分析_解析器_07


shiro流程分析_解析器_08

执行分析,shiro过滤器执行完,执行servlet过滤器

因为可能需要经过多个过滤器,所以一个一个过滤器执行完,才会执行原来的过滤器:

shiro流程分析_解析器_09

shiro的过滤器分析

然后就是执行shiro的过滤器了;

默认过滤器

shiro流程分析_spring整合_10


shiro流程分析_解析器_11

我们先看一下登录,登录是无需拦截的走的是anon;AnonymousFilter过滤器,内部几乎为空:

首先肯定还是走的OncePerRequestFilter的doFilterInternal方法:

shiro流程分析_spring整合_12


注意创建subject的时候也会走这个方法:

shiro流程分析_解析器_13


AdviceFilter跟拦截器是一样的,preHandle,executeChain,postHandle也是之前执行,执行,之后执行等…登录就直接到了login然后就直接执行了认证方法,在一开始介绍demo的时候说过;

shiro流程分析_解析器_14

鉴权过滤器

首先看一下uml图:

shiro流程分析_解析器_15


前面相同,会执行到这里:

shiro流程分析_解析器_16


然后authc,perms[user:list],就会进到权限验证filter也就是执行isPermitted方法,这个方法原理也在开头讲过了,这时候shiro部分的请求就完成了…:

shiro流程分析_解析器_17

然后返回会执行到Controller定义的方法

然后返回执行postHandle方法

shiro流程分析_代理类_18


这样一个流程就结束了…