首先从例如以下配置開始说起
ShiroDbFilterFactoryBean继承了ShiroFilterFactoryBean这个由jar提供的bean类,
而且它实现了InitializingBean接口
方法例如以下
有个基本常识,实例化ShiroDbFilterFactoryBean必先实例化ShiroFilterFactoryBean
那我们应当看看ShiroFilterFactoryBean如今正式開始一步步探个到底。里面都做什么事情了
一、ShiroFilterFactoryBean
1、getObject()方法
此类实现了FactoryBean接口。则Object getObject():返回有FactoryBean创建的Bean实例,假设isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。
2、createInstance()方法
3、createFilterChainManager()方法
这种方法将返回shiro须要的一个重要对象:DefaultFilterChainManager
3.1、加入所需过滤器
3.2、加入须要过滤的url连接
3.2.1、splitChainDefinition方法
它的目的是切割
filterTokens[0]=cAuthc
filterTokens[1]=cRoles[999]
3.2.2、toNameConfigPair方法
它的目的是切割。如cRoles[999] 为
nameConfigPair[0]=cRoles
nameConfigPair[1]=999
3.2.3、addToChain方法
3.2.3.1、applyChainConfig方法
找到相应的filter
三、shiro眼下都提供了这些过滤器
仅仅要你的訪问路劲约定了以下随意一个过滤器,都会由其推断你的权限
AnonymousFilter过滤器
在你訪问的地址属于应该AnonymousFilter过滤的时候会发生什么呢。比方/login.html
看到了吧,直接放行
四、PathMatchingFilter
看了上面两个样例了。该注意关键,它们都终于继承了PathMatchingFilter,注意咯,既然都是继承了它。那肯定是PathMatchingFilter对url过滤拦截的时候在拦截方法中会调用
protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue)
一起 看看isFilterChainContinued(request, response, path, config)
onPreHandle(request, response, pathConfig)
真正实现这种方法的是在
这里我们以最重要的 AccessControlFilter 为例
public abstract class AccessControlFilterextendsPathMatchingFilter
- isAccessAllowed:即是否同意訪问,返回true表示同意。
- onAccessDenied:表示訪问拒绝时是否自己处理,假设返回true表示自己不处理且继续拦截器链运行,返回false表示自己已经处理了(比方重定向到还有一个页面)。
也就是说当isAccessAllowed不同意訪问时(false)。由onAccessDenied 处理,比方FormAuthenticationFilter过滤器,它首先推断是不是登陆url。假设是登陆url,又区分是
get提交的话。就放过去,是post提交就登陆。假设不是登陆url,就保存当前訪问的url,而且跳到登陆页。
而isAccessAllowed(request, response, mappedValue)的实如今 public abstract classAuthenticatingFilter extendsAuthenticationFilter
super.isAccessAllowed(request, response, mappedValue)在它的父类public abstract classAuthenticationFilter
extendsAccessControlFilter
它的作用是推断用户是否authentication(认证; 身份验证)成功过。 ps:authorization(授权,批准)
那么回到public abstract class AccessControlFilter extends PathMatchingFilter
它的onAccessDenied(request, response, mappedValue)由谁实现呢
事实上是详细的过滤器。如:public class FormAuthenticationFilterextendsAuthenticatingFilter
最后说说 appliedPaths 会拿到属于某个过滤器全部它该过滤的链接,那你要问怎么拿到的,别急,跟着一起去看看吧
继续
我们又回到了一開始看到的DefaultFilterChainManager
惊奇吧
就在系统启动初始化的时候,配置中的相关信息就已经都放入各个filter中了
记住一句话源代码面前了无秘密。