关于shiro拦截器filterChainDefinitions的设置及使用过程源码分析

shiro源码分析,查了些资料,针对于在shiro框架中设置filterChainDefinitions遇到的小问题,做一下分析备忘记录。

问题描述:
在设置filterChainDefinitions的时候,如果/k/**设置在/k/index之前,那么/k/index将不会生效,有规则说: 拦截器的优先级是从上到下,从左到右,如果有匹配的拦截器就会阻断并返回。

设置:
1、ShiroFilterFactoryBean.setFilterChainDefinitions方法,获取基本参数,转化为Section键值对,'='左边为键,右边为值,存到filterChainDefinitionMap中,此时用的是LinkedHashMap,有序的,所以过滤器的生效有着先后顺序
2、调用ShiroFilterFactoryBean.getObject方法(ShiroFilterFactoryBean是实现了FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,所以spring在获取ShiroFilterFactoryBean时,返回的是ShiroFilterFactoryBean的getObject()方法)
3、方法createInstance中,构造了一个FilterChainManager,createFilterChainManager方法里,取出了默认的过滤器DefaultFilter,getFilters取出在配置文件中配置的过滤器,这两者都调用了applyGlobalPropertiesIfNecessary,来找到loginUrl、successUrl、unauthorizedUrl对应的过滤器,最后用filterChainDefinitionMap来生成自定义url与过滤器的关系,这样就将设置的url和相对应的过滤器联系在一起了,最外层,用PathMatchingFilterChainResolver将FilterChainManager进行包装,将改过滤器链管理器设置到SpringShiroFilter.setFilterChainResolver中,最后返回一个SpringShiroFilter对象,这个对象会将后面所有的请求拦截过滤
使用:
1、关于SpringShiroFilter的继承关系如下:
SpringShiroFilter extends AbstractShiroFilter
AbstractShiroFilter extends OncePerRequestFilter,doFilter在类OncePerRequestFilter中
当一个请求过来,在web.xml中shiroFilter对应的类是DelegatingFilterProxy,它作为一个Filter,主要方法是doFilte,在doFilter中将上下文的bean赋值给delegate,调用invokeDelegate方法中调用delegate.doFilter方法,最后到具体的过滤器OncePerRequestFilter中,调用doFilterInternal方法,该方法的具体实现在AbstractShiroFilter类中,调用executeChain方法,调用getExecutionChain方法
2、方法getExecutionChain中,resolver的值来自于之前设置的SpringShiroFilter.setFilterChainResolver,调用resolver.getChain即PathMatchingFilterChainResolver,调用PathMatchingFilterChainResolver.getChain,有一个pathMatches判断当前请求的url是否有绑定过滤器,如果有,调用filterChainManager.proxy,然后返回,所以这里只要有一个过滤器匹配上了,后面的过滤器就不会生效了,这个就是之前配置未生效的原因,所以全路径的过滤器要配置在最后
3、附上最终的调用顺序:filterChainManager.proxy——DefaultFilterChainManager.proxy——configured.proxy——SimpleNamedFilterList.proxy——ProxiedFilterChain——ProxiedFilterChain.doFilter——调用真生过滤器的doFilter方法


这里有一个问题还没有解决:DelegatingFilterProxy是怎么将具体工作分派给ShiroFilterFactoryBean这个类中的静态内部类SpringShiroFilter做的?
 
  
 
  

猜你喜欢

转载自blog.csdn.net/u012602046/article/details/80295288