西安网站建设培训学校,和17做网店一样的货源网站,用双语网站做seo会不会,怎么建立一个网站网址一、背景
在使用若依框架#xff08;前后端不分离包含shiro安全框架#xff09;时#xff0c;发现作者添加了验证码、登录帐号控制等自定义过滤器#xff0c;于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例#xff0c;对源码解析。注意类之间的继承关…一、背景
在使用若依框架前后端不分离包含shiro安全框架时发现作者添加了验证码、登录帐号控制等自定义过滤器于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例对源码解析。注意类之间的继承关系和类中属性存储的值。
二、过滤器加载流程
1、ShiroFilterFactoryBean类创建
1、在ShiroConfig中有ShiroFilterFactoryBean创建及配置类若依中使用的是CustomShiroFilterFactoryBean继承了ShiroFilterFactoryBean其中有两个重要配置一是filters自定义过滤器Map集合key为拦截器别名可以配置在FilterChainDefinitionMap中value值value是过滤器实体二是FilterChainDefinitionMapkey为要过滤的url,value是使用的过滤器别名需要和filters中key值匹配。例如如下图/login及/register两个url会被验证码过滤器过滤。
2、FilterChainManager类创建
1、CustomShiroFilterFactoryBean继承了ShiroFilterFactoryBean实现了FactoryBean类所以spring创建这种类型的类时会执行getObject如果对象不存在则创建执行createInstance。 2、在createInstance 中会执行createFilterChainManager方法创建FilterChainManagercreateFilterChainManager方法中会给FilterChainManager设置两个重要属性第一个遍历1.1处配置filters集合给FilterChainManager中的filters集合赋值key为filter别名value为filter实体此时会给Nameable类型filter设置Name为filter别名。此时FilterChainManager中属性filters中添加了所有自定义过滤器和系统默认的过滤器。系统默认过滤器时在创建对象DefaultFilterChainManager构造方法中调用addDefaultFilters添加DefaultFilterChainManager继承FilterChainManager。 3、获取上面1.1配置FilterChainDefinitionMap过滤器链并遍历,在DefaultFilterChainManager中执行createChain创建过滤器执行链。 filterTokens为filter别名数组遍历数组执行addToChain,第一个参数是url,第二个是filter别名第三个是filter配置参数。继续跟踪addToChain。 4、SimpleNamedFilterList实现了NamedFilterList类addToChain方法中创建SimpleNamedFilterList类ensureChain方法把filter放入SimpleNamedFilterList类属性backingList集合中。DefaultFilterChainManager中属性filterChains中存的是以url为key,value是SimpleNamedFilterList类型的对象。 (5)、总结一下创建DefaultFilterChainManager完成后DefaultFilterChainManager中有两个重要属性一个是filters所有过滤器map集合第二个是filterChains所有url对应过滤器链例如/login对应SimpleNamedFilterList类中属性backingList集合中有invaldRequetFilter、AnonymousFiter、CaptchaValidateFilter三个过滤器。
3、MySpringShiroFilter类创建
PathMatchingFilterChainResolver类中setFilterChainManager把2中创建的DefaultFilterChainManager设置到filterChainManager属性中。创建MySpringShiroFilter时通过构造函数把PathMatchingFilterChainResolver传入。MySpringShiroFilter继承自AbstractShiroFilter最终给AbstractShiroFilter的属性filterChainResolver赋值。 总结一下通过shiroConifg类最终创建出的mySpringShiroFilter继承AbstactShiroFilter,AbstactShiroFilter中属性filterChainResolver为pathMatchingFilterChainResolver,AbstactShiroFilter继承了OncePerRequestFilter,所以在过滤url时执行doFilterInternal方法。
4、过滤器执行流程
doFilterInternal中执行executeChain-getExecutionChain getFilterChainResolver获取PathMatchingFilterChainResolver执行PathMatchingFilterChainResolver中的getChain 如下图执行步骤匹配成功后执行DefaultFilterChainManager类中proxy方法。 通过url获取SimpleNamedFilterList类执行SimpleNamedFilterList类中proxy方法。 创建出ProxiedFilterChain对象其中第二个参数是SimpleNamedFilterList自身。 最终返回ProxiedFilterChain对象执行ProxiedFilterChain中doFilter方法会按顺序执行该url对应的过滤器。 captchaValidateFilter继承关系执行captchaValidateFilter的doFilter方法 时会进入父类OncePerRequestFilter的doFilterInternal 进入父类adviceFilter的doFilterInernal,
进入父类PathMatchingFilter中preHandle,配上url后执行isFilterChainContinued 执行到父类AccessControlFilter的onPreHandle,最终执行到本类CaptchaValidateFilter的onAccessDenied和onAccessDenied方法有一个满足即为true. 执行完成后继续返回到adviceFilter.判断是否继续执行下一个filter。