文章目录
- 流程分析
- 请求进来,生成subject然后执行过滤器
- 代理过滤器,生成代理类,先执行shiro的过滤器然后执行Servlet
- 获取解析器
- 根据请求进行匹配
- 生成代理其实就是ProxiedFilterChain:
- 执行分析,shiro过滤器执行完,执行servlet过滤器
- shiro的过滤器分析
- 我们先看一下登录,登录是无需拦截的走的是anon;AnonymousFilter过滤器,内部几乎为空:
- 鉴权过滤器
- 然后返回会执行到Controller定义的方法
流程分析
前面讲了shiro的登录和spring整合的使用这里就使用简单的ssm项目来分析shiro的请求大致流程:
请求进来,生成subject然后执行过滤器
前面讲了subject的生成:
subject生成
前面讲的是创建subject对象,现在来讲执行过滤器链;
代理过滤器,生成代理类,先执行shiro的过滤器然后执行Servlet
首先shiro直接将servlet原来过滤器放在一边,执行完shiro自己的过滤器才会执行原来的过滤器:
获取解析器
根据请求进行匹配
对请求的路径进行匹配,找到对应的过滤器,可以重写匹配方法,来实现restful风格的权限验证:
生成代理其实就是ProxiedFilterChain:
执行分析,shiro过滤器执行完,执行servlet过滤器
因为可能需要经过多个过滤器,所以一个一个过滤器执行完,才会执行原来的过滤器:
shiro的过滤器分析
然后就是执行shiro的过滤器了;
我们先看一下登录,登录是无需拦截的走的是anon;AnonymousFilter过滤器,内部几乎为空:
首先肯定还是走的OncePerRequestFilter的doFilterInternal方法:
注意创建subject的时候也会走这个方法:
AdviceFilter跟拦截器是一样的,preHandle,executeChain,postHandle也是之前执行,执行,之后执行等…登录就直接到了login然后就直接执行了认证方法,在一开始介绍demo的时候说过;
鉴权过滤器
首先看一下uml图:
前面相同,会执行到这里:
然后authc,perms[user:list],就会进到权限验证filter也就是执行isPermitted方法,这个方法原理也在开头讲过了,这时候shiro部分的请求就完成了…:
然后返回会执行到Controller定义的方法
然后返回执行postHandle方法
这样一个流程就结束了…