Shiro源码分析系列:01.shiro初始化
2019-04-18 本文已影响0人
城南码农
关于shiro的架构和组件,可以参考开涛跟我学Shiro系列。
Shiro初始化
- 初始化DelegatingFilterProxy:
@Bean
public FilterRegistrationBean getShiroFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
// 创建FactoryBean的代理对象
DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy("shiroFilter");
delegatingFilterProxy.setTargetFilterLifecycle(true);
registrationBean.setFilter(delegatingFilterProxy);
registrationBean.setEnabled(true);
registrationBean.setOrder(2);
registrationBean.addUrlPatterns("/*");
registrationBean.setDispatcherTypes(DispatcherType.REQUEST);
return registrationBean;
}
-
初始化ShiroFilterFactoryBean,ShiroFilterFactoryBean实现了Spring的FactoryBean,默认会调用getObject(),实际调用createInstance(),实际返回一个SpringShiroFilter对象:
securityManage.jpg
chainResolver.jpg
至此,初始化过程完成,主要构造了SpringShiroFilter的对象。
接管request请求
主要搞清楚一件事,Shiro怎么从Spring那里接管到请求?先看一张流程图:
![](https://img.haomeiwen.com/i7027953/000e17624a32c723.jpg)
- 初始化阶段生成的DelegatingFilterProxy实现了Servlet的Filter接口;
- 它是一个代理对象,真正的对象是ShiroFilterFactoryBean。这里是静态代理;
- executeChain()方法是核心流程,通过初始化阶段的chainResolver解析器解析出自定义的Filter对象,并且开始循环调用他们的doFIlter方法。
至此,shiro就完全接管了web请求,接下来的章节会分析如何来拦截这些请求,执行认证,鉴权的流程。