当前位置: 首页 > news >正文

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。
在这里插入图片描述
在这里插入图片描述

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

相关文章:

shiro Filter加载和执行 源码解析

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

IDEA上传jar包到Maven

mvn install:install-file //固定格式,maven的语法 -Dfilealibaba-sdk-1.0.0.jar //这里填写包的路径,因为我们是在当前目录所以只需要输入包名即可 -DgroupIdcom.qiehua.csdn //这里填写包的groupId,之后作为pom.xml中引用的gr…...

JavaScript——基本语法

1.定义变量&#xff1a; 变量类型 变量名 变量值 var关键字声明变量 es6版本以上 var 可写可不写 <script>// 定义变量&#xff1a;变量类型 变量名 变量值 var关键字声明变量 es6版本以上 var 可写可不写var num 2;</script>2.条件控制 <script>var …...

一款最近很火的开源低代码平台

低代码平台近年来获得大量融资的原因是多方面的。首先&#xff0c;低代码平台代表了软件开发领域的一个重要趋势&#xff0c;即通过简化编程过程来降低技术门槛&#xff0c;使非专业开发者也能构建应用程序。这为那些希望加速数字化转型的企业提供了新的可能性&#xff0c;因此…...

vue之代理配置devServer(vue.config.js)片段

关于vue.config.js的部分配置解析&#xff1a;首先看下面一段配置 devServer: { open: process.platform darwin,//true or false &#xff08;true则启动项目自动打开系统自带浏览器&#xff09; host: 0.0.0.0, // 配置devServer服务监听的地址 比如&#xff1a;想让局域网…...

CTD测试流程

连接 连接17Plus&#xff0c;用usb转232线&#xff0c;db9公针2、3分别接Data I/O的2、3。DB9的5接Data I/O的1。尼龙塞子打开状态。不用闭合。 软件连接 打开SeaTermAF V2&#xff0c;注意打开前先把串口插上&#xff0c;否则软件读不到串口。如果读不到&#xff0c;就在插…...

面试经典150题(15-19)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第七天&#xff09;完成了5道(15-19)150&#xff1a; 今天这些都是我之前做过的&#xff0c;还有就是今天的全都是模拟过程。。所以做的还算快。 15&#xff08;13. 罗马数字转整数&#xff09; 题目描述&a…...

Linux下的网络服务

一般来说&#xff0c;各种操作系统在网络方面的性能比较是这样的顺序BSD>Linux>Win NT>Win 9X, 由此说来&#xff0c;Linux的网络功能仅次于UNIX&#xff0c;而强于Win NT和其它的视窗系列产品&#xff0c;对于Win2000我还不能评价太多&#xff0c;因为不是很熟。 Lin…...

制造业对于IT软硬件监控和摄像头故障监控的需求

制造业对于生产线的自动化和智能化需求较高&#xff0c;IT监控运维管理软件在制造业的应用也日益普及。监控易为制造业提供了一系列定制化的解决方案&#xff0c;助力企业实现生产线的智能化和高效化。 随着制造业的数字化转型和智能化升级&#xff0c;IT运维管理软件的需求也在…...

idea一些报错

java: 非法字符: \ufeff 使用IDEA修改文件编码 在IDEA右下角&#xff0c;将编码改为GBK&#xff0c;再转为UTF-8&#xff0c;重新启动项目。具体步骤如下&#xff1a; 在IDEA右下角找到UTF-8字样的编码格式设计项&#xff0c;点击选择第一项GBK&#xff0c;然后Convert&#xf…...

【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…...

Android Dialog 弹出时,隐藏 navigation bar

1、概述 一些场合&#xff0c;要求界面是全屏的&#xff0c;然而在全屏界面下&#xff0c;弹出dialog 又会导致虚拟按键栏重新弹出来&#xff0c;也是比较难受的。(而且查了非常多方法都是不能完美的解决这个问题&#xff0c;要么是压根不能用&#xff0c;要么是会闪一下虚拟栏…...

LeetCode(Hot100)——1:两数之和

方法1&#xff1a;暴力求解 利用两次for循环来处理&#xff0c; 外循环确定一个数字&#xff0c; 利用内循环不断求和来判断是否两数之和为target&#xff0c;来进行求解。 public class LeetCode1 {Test//测试方法public void test() {int [] nums{2,7,11,15};int target9;/…...

【Qt】报错error:undefined reference to `vtable for Consumer‘的解决方法

1. 问题原因 在创建完程序后&#xff0c;点击构建&#xff0c;显示编译错误。 错误问题如下: error: undefined reference to vtable在编译输出中查看显示如下&#xff1a; error:undefined reference to vtable for custom2. 原因分析 这个错误通常是因为 C 的虚函数表&am…...

【linux系统】用户功能与权限详细总结

前言 菜某的笔记总结&#xff0c;有错误还请指正。 linux用户的概念与root用户 这么理解&#xff1a;一台电脑有多个操作者&#xff0c;每个操作者只能无限制操作自己文件夹中的东西&#xff0c;其他地方的操作需要给与相应权限才能操作。 root用户&#xff1a;就是最高级的…...

ELK简单介绍二

学习目标 能够部署kibana并连接elasticsearch集群能够通过kibana查看elasticsearch索引信息知道用filebeat收集日志相对于logstash的优点能够安装filebeat能够使用filebeat收集日志并传输给logstash kibana kibana介绍 Kibana是一个开源的可视化平台,可以为ElasticSearch集群…...

video 标签 各种属性及所有事件监听

网页中的video 属性和事件&#xff0c;用于计算观看视频的时长&#xff0c;其他用法备存。 <!-- video 不支持 IE8及以下版本浏览器&#xff0c;支持三种视频格式&#xff1a;MP4&#xff0c;WebM 和 Ogg --><video src"test.mp4" controls width"400…...

TS中断言、转换的应用

1.TS 类型断言定义 把两种能有重叠关系的数据类型进行相互转换的一种 TS 语法&#xff0c;把其中的一种数据类型转换成另外一种数据类型。类型断言和类型转换产生的效果一样&#xff0c;但语法格式不同。 2.TS 类型断言语法格式 A 数据类型的变量 as B 数据类型 。 A 数据类…...

【代码随想录算法训练营-第四天】【链表】24,19, 面试题 02.07,142

24. 两两交换链表中的节点 第一遍-递归-小看了一下题解 思路&#xff1a; 读了两遍题目才理解…相邻节点的交换&#xff0c;这个操作很容易实现&#xff0c;但需要一个tmpNode因为是链表的题目&#xff0c;没开始思考之前先加了dummyNode&#xff0c;还真管用把dummyNode作为…...

代理设计模式

1. 代理模式 1.1 代理模式的原理分析 代理设计模式&#xff08;Proxy Design Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代理对象&#xff0c;以控制对这个对象的访问。代理模式可以用于实现懒加载、安全访问控制、日志记录等功能。 代理模式…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...