shiro Filter加载和执行 源码解析

一、背景

在使用若依框架(前后端不分离包含shiro安全框架)时,发现作者添加了验证码、登录帐号控制等自定义过滤器,于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例,对源码解析。注意类之间的继承关系和类中属性存储的值。

二、过滤器加载流程

1、ShiroFilterFactoryBean类创建

(1)、在ShiroConfig中有ShiroFilterFactoryBean创建及配置类(若依中使用的是CustomShiroFilterFactoryBean,继承了ShiroFilterFactoryBean),其中有两个重要配置,一是filters,自定义过滤器Map集合,key为拦截器别名,可以配置在FilterChainDefinitionMap中value值,value是过滤器实体,二是FilterChainDefinitionMap,key为要过滤的url,value是使用的过滤器别名,需要和filters中key值匹配。例如如下图,/login及/register两个url会被验证码过滤器过滤。
在这里插入图片描述

2、FilterChainManager类创建

(1)、CustomShiroFilterFactoryBean继承了ShiroFilterFactoryBean实现了FactoryBean类所以spring创建这种类型的类时,会执行getObject如果对象不存在则创建执行createInstance。在这里插入图片描述
(2)、在createInstance 中会执行createFilterChainManager方法创建FilterChainManager,createFilterChainManager方法中会给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。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链游成为蓝海,潮游世界开创未来新时代

区块链、元宇宙浪潮来袭,为数字世界开启崭新的大门,一场链游模式的范式革命正在发生! 未来,元宇宙中,链游将成为中坚力量。 潮游世界抢占时代先机,利用区块链技术的去中心化和数字资产的不可替代性&#x…

当当狸AR智能学习图集跨越千年文明传承,邀您“面对面”与虚拟诗人互动对诗

中华传统文化底蕴深厚,余韵悠长。即使经过千年的历史裂变,依然历久铭心慰藉着一代又一代人的灵魂。千百年后的今天,成为了我们独一无二的财富。 如今,国人学习中华传统文化的方式有很多,诗词集、动画影片、诗歌传颂等…

生物技术行业分析:预计2029年将达到55707亿元

生物技术( biotechnology),是指人们以现代生命科学为基础,结合其他基础科学的科学原理,采用先进的科学技术手段,按照预先的设计改造生物体或加工生物原料,为人类生产出所需产品或达到某种目的的技术方式生物技术利用对微生物、动植物等多个领域的深入研究,利用新兴技术对物质原…

Unity2023.3(有可能叫Unity6)版本开始将可以发布WebGPU

翻译一段官网上的话: 利用Unity 2023.3(发布时有可能叫Unity6)中最新的WebGPU图形API集成,尝试最大限度的提升您的网络游戏的真实感。 通过与谷歌的战略合作,Unity实时3D平台的强大的图形功能现在为图形丰富的网络游戏进行微调,实…

如何解决PET材料难于粘接的问题?有效解决方案分享!

1.PET是什么材料?有哪些特点和用途? PET是聚对苯二甲酸乙二醇酯(Polyethylene Terephthalate)的缩写,是一种常见的塑料材料。它具有以下特点: 高强度和刚性:PET具有较高的拉伸强度和模量,使其…

python对验证码进行降噪处理

举例图: 第一步先通过二值化处理把干扰线去掉: from PIL import Image# 二值化处理 def two_value():for i in range(1,5):# 打开文件夹中的图片imageImage.open(./Img/str(i).jpg)# 灰度图limimage.convert(L)# 灰度阈值设为165,低于这个值…

如何使用CFImagehost结合内网穿透搭建简洁易用的私人图床并远程访问

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

从零开始学Python系列课程第13课:Python中的循环结构(上)

一、循环结构的应用场景及分类 我们在编写程序时,一定会遇到需要重复执行某些指令的场景。举一个简单的例子,在前面讲分支结构时以游戏通关为例,如果第一关结束时分值不够则通关失败需要重新闯关,重新闯关这就是一个重复性的动作…

概率的乘法公式

两个事件的情况 假设A、B为随机事件,并且事件A的概率,那么 三个事件的情况 假设A、B、C为随机事件,并且,那么 多个事件的情况 假设为随机事件,其中,并且,那么

Resolving ORA-600[3020] Raised During Recovery

Resolving ORA-600[3020] Raised During Recovery (Doc ID 361172.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database Exadata Cloud Machine - Version N/A and later Oracle Cloud Infrastructure - Database Ser…

Arduino中以太网Udp通信

目录 1、测试硬件 2、程序 (0)头文件添加 (1)变量定义 (2)初始化程序 (3)循环执行程序 3、程序下载 (1)开发板控制器和端口号选择 (2&am…

淘宝订单API接口在电商行业中的应用与实现

一、引言 随着电商行业的快速发展,订单处理成为电商运营的核心环节。淘宝作为中国最大的电商平台之一,其订单API接口在电商行业中的应用越来越广泛。本文将详细介绍淘宝订单API接口在电商行业中的应用,并深入剖析相关的技术细节,…

基于级联式逆残差网络的遥感图像轻量目标检测算法

源自:电子学报 作者:陈立 张帆 郭威 黄赟 李继中 “人工智能技术与咨询” 发布 摘 要 遥感场景下的高实时目标检测任务具有重要的研究价值与应用意义. 针对当前遥感图像目标检测模型由于目标多角度、排列密集以及背景复杂从而导致检测速度慢的…

免费且好用的 MySQL 客户端

DBeaver 支持 Mac、Windows、Linux,提供 Eclipse 插件。社区版免费,支持主流的关系型数据库 官网地址:DBeaver Community | Free Universal Database Tool MySQL WorkBench MySQL WorkBench 是官方出品的客户端,支持 Mac、Windo…

QVTK 可视化

#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>#include <vtkNew.h> // 智能指针 #include <QVTKOpenGLNativeWidget.h> #include <vtkCylinderSource.h> // 圆柱#include <vtkPolyDataMapper.h&g…

JVM虚拟机系统性学习-垃圾回收器Serial、ParNew、Parallel Scavenge和Parallel Old

垃圾回收器 有 8 种垃圾回收器&#xff0c;分别用于不同分代的垃圾回收&#xff1a; 新生代回收器&#xff1a;Serial、ParNew、Parallel Scavenge老年代回收器&#xff1a;Serial Old、Parallel Old、CMS整堆回收器&#xff1a;G1、ZGC Serial&#xff1a;串行回收 Serial是…

圣诞节酷炫特效合集【含十几个HTML+CSS前端特效+34个桌面酷炫圣诞程序】

写在前面 ❤️源码获取:订阅后见文末 ❤️内容介绍:包含HTML+CSS等十几个圣诞特效;以及三十四个桌面酷炫圣诞树合集 ❤️订阅后所得如下: ❤️HTML圣诞+桌面圣诞程序效果如下: 下方展示代码仅举例其中几个 所有效果源码及文件订阅后找博主获取即可 🎄css3圣诞雪人动…

git分支查询与回退(终端命令行方式)

必要性 git的记录查询与回退是开发者必须会的一个要素,因为很少有人能做到代码管理没有任何问题 而且就算你能做到,你也需要会查询与回退分支 查询所有记录 当你在开发的时候,你突然想查看自己之前的提交记录,你可以使用下面这个命令 git log 虽然一下只会展示一小部分,但…

【Python】__init__.py文件的使用

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、__init__.py文件1.不创建__init__.py文件2.创建__init__.py文件 二、使用1.设置公共参数2.写from .** import **3.__all__ import * …

NXP应用随记(二):S32K3xx内存随记

目录 1、TCM 1.1、代码放置在ITCM的方式 __attribute__ 的函数属性 __attribute__ 的变量属性 __attribute__ 的类型属性 __attribute__ 的优化控制属性 1.2、DTCM 1.3、TCM的使用注意事项 1、TCM CMTightly Coupled Memory&#xff0c;是一种高速缓存&#xff0c;据说是…