您的位置:首页 > 其它

自己的研究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 过滤器流程