自己的研究shiro框架的感悟1
2016-10-16 00:00
253 查看
摘要: 过滤器的流程
首先在配置shiro框架时,由spring托管shiro。由spring框架中的DelegatingFilterProxy类来代理shiro框架中的ShiroFilterFactoryBean类,这样spring和shiro就有建立了关系。
web.xml文件中配置:
sprio-shiro.xml文件中配置:
当浏览器发起请求时(前面已经讲到spring托管了shiro),那么就调用OncePerRequestFilter的doFilter方法。为什么调用这个类方法,首先我们来看一下的shiro的各过滤器的一个关系:
而且spring在创建ShiroFilterFactoryBean单例对象的时候,会调用ShiroFilterFactoryBean的getObject()方法,getObject()方法里在调用createInstance()方法来创建SpringShiroFilter单例对象:
而SpringShiroFilter类继承AbstractShiroFilter,而AbstractShiroFilter又继承OncePerRequestFilter(由上面的过滤器关系可以知道)。所以当浏览器发起请求时,会首先就调用OncePerRequestFilter的doFilter()方法。OncePerRequestFilter.doFilter()方法内部所做的操作如下图,会调用doFilterInternal()方法:
有哪些子类重写这个方法呢只有两个(一:AbstractShiroFilter;二:AdviceFilter)。看图:
因为SpringShiroFilter只继承了AbstractShiroFilter,所以只调用AbstractShiroFilter的doFilterInternal方法:
通过上面的图可以看到subject就是在这个时候创建的。当然后续还会做一些初始化的操作。可以知道有一个excuteChain方法,该方法需要一个chain属性,这个就是原生的过滤器链,是catalina的。看图:
接回excuteChain方法,该方法会生成一个代理的过滤器链,并执行里面过滤器的doFilter()方法操作。在生成这个代理的过滤器链,会做一些请求的路径和自己在配置spring-shiro文件中配置的路径是否有匹配的。如发现有匹配的,就会生成过滤器链。看下图:
这个代理过滤器链的名称就是,如下图:
到现在,一些基本的操作已经完成(比如subject创建等)。接下来就是真正执行过滤器链的时候了。
有一个假设:浏览器第一次访问该系统,sessionid已经失效的情况下。会得到如下图:
根据路径解析会得到UserFilter(shiro自带的)和SysUserFilter(这个是自己定义的过滤,并交给shiroFilterFactoryBean进行了管理)。接下来就开始执行ProxiedFilterChain的doFilter()方法。看图:
像UserFilter和SysUserFilter就在这里执行开始之路。因为按照顺序首先执行UserFilter过滤器。执行doFilter()方法(OncePerRequestFilter的doFilter(),因为子类没有重写这个方法),接着在OncePerRequestFilter的doFilter()里执行doFilterInternal()方法。注意:此时不在执行AbstractShiroFilter的doFilterInternal()方法,而是执行AdviceFilter类的doFilterInternal()方法。由上面的过滤器的关系可以知道UserFilter只继承了AdviceFilter抽象类。所以此时执行AdviceFilter类的doFilterInternal()方法。看图:
接着就是一路执行,浏览器第一次请求服务器的时候,会需要生成sessionid给浏览器。看图:
首先在配置shiro框架时,由spring托管shiro。由spring框架中的DelegatingFilterProxy类来代理shiro框架中的ShiroFilterFactoryBean类,这样spring和shiro就有建立了关系。
web.xml文件中配置:
sprio-shiro.xml文件中配置:
当浏览器发起请求时(前面已经讲到spring托管了shiro),那么就调用OncePerRequestFilter的doFilter方法。为什么调用这个类方法,首先我们来看一下的shiro的各过滤器的一个关系:
而且spring在创建ShiroFilterFactoryBean单例对象的时候,会调用ShiroFilterFactoryBean的getObject()方法,getObject()方法里在调用createInstance()方法来创建SpringShiroFilter单例对象:
而SpringShiroFilter类继承AbstractShiroFilter,而AbstractShiroFilter又继承OncePerRequestFilter(由上面的过滤器关系可以知道)。所以当浏览器发起请求时,会首先就调用OncePerRequestFilter的doFilter()方法。OncePerRequestFilter.doFilter()方法内部所做的操作如下图,会调用doFilterInternal()方法:
有哪些子类重写这个方法呢只有两个(一:AbstractShiroFilter;二:AdviceFilter)。看图:
因为SpringShiroFilter只继承了AbstractShiroFilter,所以只调用AbstractShiroFilter的doFilterInternal方法:
通过上面的图可以看到subject就是在这个时候创建的。当然后续还会做一些初始化的操作。可以知道有一个excuteChain方法,该方法需要一个chain属性,这个就是原生的过滤器链,是catalina的。看图:
接回excuteChain方法,该方法会生成一个代理的过滤器链,并执行里面过滤器的doFilter()方法操作。在生成这个代理的过滤器链,会做一些请求的路径和自己在配置spring-shiro文件中配置的路径是否有匹配的。如发现有匹配的,就会生成过滤器链。看下图:
这个代理过滤器链的名称就是,如下图:
到现在,一些基本的操作已经完成(比如subject创建等)。接下来就是真正执行过滤器链的时候了。
有一个假设:浏览器第一次访问该系统,sessionid已经失效的情况下。会得到如下图:
根据路径解析会得到UserFilter(shiro自带的)和SysUserFilter(这个是自己定义的过滤,并交给shiroFilterFactoryBean进行了管理)。接下来就开始执行ProxiedFilterChain的doFilter()方法。看图:
像UserFilter和SysUserFilter就在这里执行开始之路。因为按照顺序首先执行UserFilter过滤器。执行doFilter()方法(OncePerRequestFilter的doFilter(),因为子类没有重写这个方法),接着在OncePerRequestFilter的doFilter()里执行doFilterInternal()方法。注意:此时不在执行AbstractShiroFilter的doFilterInternal()方法,而是执行AdviceFilter类的doFilterInternal()方法。由上面的过滤器的关系可以知道UserFilter只继承了AdviceFilter抽象类。所以此时执行AdviceFilter类的doFilterInternal()方法。看图:
接着就是一路执行,浏览器第一次请求服务器的时候,会需要生成sessionid给浏览器。看图:
相关文章推荐
- 自己的研究shiro框架的感悟2
- 自己的研究shiro框架的感悟3
- 安全认证框架-Apache Shiro研究心得
- 安全认证框架-Apache Shiro研究心得
- 安全认证框架-apache shiro研究心得
- 自己加了shiro在ssm框架里报错
- 想把cocos2d-x的框架研究研究,权且开个头吧,从demo开始,给自己加油!!!!
- 大家都知道,木头一直都没有在大的游戏公司待过,没见识也没经历过优秀的项目。最近想研究一些开源的Unity3D框架,开拓一下自己的思维。 优先入坑的是Entitas框架,本系列教程基于0.42.3版本。
- 安全认证框架-Apache Shiro研究心得
- 自己研究两天的软件冲突事件
- 怎样写自己的ConfigurationHandler(DOTNETNUKE 研究)?
- 让自己的框架实现缓存的功能
- 分析现在大多数学计算机的失败的原因!---自己感悟
- 值得研究的PHP主流FrameWork框架
- 学习如何用自己的 appender 来扩展 log4j 框架
- 介绍一下自己的开发框架CSoftSample.NET
- 关于自己的框架-完成进度
- 自己动手写游戏引擎一(Windows窗口框架)
- Symbian程序框架研究