SpringSecurity之基本原理——过滤器加载过程

news2024/11/22 19:48:24

前言

前一篇讲解了SpringSecurity的过滤器链的基本只是,今天我们就要进入过滤器,看看其加载过程是如何的?

相信认真度过第一篇文章的小伙伴还记得,我说在SpringBoot出现后,帮助我们省去了那些繁琐的配置,实现了自动配置。那么,我们更应该了解他是如何实现自动加载的了!

过滤器如何进行加载的?

要是用过滤器,就必须配置过滤器 DelegatingFilterProxy ,之所以我们在前面的示例中没有进行配置,是因为Spring Boot 为我们完成了。

具体的加载逻辑如下图所示:

 接下来,我们通过代码来看一下

首先进入到DelegatingFilterProxy类中的doFilter中

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        Filter delegateToUse = this.delegate;
        if (delegateToUse == null) {
            Object var5 = this.delegateMonitor;
            synchronized(this.delegateMonitor) {
                delegateToUse = this.delegate;
                if (delegateToUse == null) {
                    WebApplicationContext wac = this.findWebApplicationContext();
                    if (wac == null) {
                        throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?");
                    }

                    delegateToUse = this.initDelegate(wac);
                }

                this.delegate = delegateToUse;
            }
        }

        this.invokeDelegate(delegateToUse, request, response, filterChain);
    }

执行delegateToUse = this.initDelegate(wac);后进入到FilterChainProxy类中,

List<Filter> filters = this.getFilters((HttpServletRequest)firewallRequest);加载所有的过滤器

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
        if (!clearContext) {
            this.doFilterInternal(request, response, chain);
        } else {
            try {
                request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
                this.doFilterInternal(request, response, chain);
            } catch (Exception var11) {
                Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(var11);
                Throwable requestRejectedException = this.throwableAnalyzer.getFirstThrowableOfType(RequestRejectedException.class, causeChain);
                if (!(requestRejectedException instanceof RequestRejectedException)) {
                    throw var11;
                }

                this.requestRejectedHandler.handle((HttpServletRequest)request, (HttpServletResponse)response, (RequestRejectedException)requestRejectedException);
            } finally {
                SecurityContextHolder.clearContext();
                request.removeAttribute(FILTER_APPLIED);
            }

        }
    }

private void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        FirewalledRequest firewallRequest = this.firewall.getFirewalledRequest((HttpServletRequest)request);
        HttpServletResponse firewallResponse = this.firewall.getFirewalledResponse((HttpServletResponse)response);
        List<Filter> filters = this.getFilters((HttpServletRequest)firewallRequest);
        if (filters != null && filters.size() != 0) {
            if (logger.isDebugEnabled()) {
                logger.debug(LogMessage.of(() -> {
                    return "Securing " + requestLine(firewallRequest);
                }));
            }

            FilterChainProxy.VirtualFilterChain virtualFilterChain = new FilterChainProxy.VirtualFilterChain(firewallRequest, chain, filters);
            virtualFilterChain.doFilter(firewallRequest, firewallResponse);
        } else {
            if (logger.isTraceEnabled()) {
                logger.trace(LogMessage.of(() -> {
                    return "No security for " + requestLine(firewallRequest);
                }));
            }

            firewallRequest.reset();
            chain.doFilter(firewallRequest, firewallResponse);
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年MathorCup数模A题赛题

A 题 量子计算机在信用评分卡组合优化中的应用 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需要先通过 各种审核规则对客户的信用等级进行评定&#xff0c;通过评定后的客户才能获得信 用或贷款资格。规则审核过程实际是经过一重或者多重组合规则…

树的直径问题

一&#xff0c;定义 树的直径就树中所有最短路经距离的最大值 求取树的直径可以使用两遍dfs或者树形dp获得 二&#xff0c;两遍dfs获得树的直径&#xff08;注意&#xff0c;该方法边权必须都为正边权&#xff09; 思路&#xff1a; 我们首先任取一点走dfs&#xff0c;然后…

索引:索引知识重复习,什么是索引、索引的类型、建立索引及【最左匹配原则】、Explain查看sql的执行计划

文章目录什么是索引索引的类型主键索引&#xff08;primary key&#xff09;普通索引&#xff08;index&#xff09;复合索引全文索引&#xff08;fulltext&#xff09;空间索引唯一索引索引修改及删除Explain一、using filesort(减慢查询效率)二、Using temporary三、using in…

TensorFlow 1.x学习(系列二 :3):变量与tensorboard可视化

文章目录1.变量2.可视化学习 Tensorboard3.可视化过程中遇到的问题&#xff1a;import tensorflow as tf1.变量 变量op: 变量也是一种OP&#xff0c;是一种特殊的张量&#xff0c;能够进行存储持久化&#xff0c;它的值就是张量&#xff0c;默认被训练和常量不同&#xff08;…

15个 AI-powered应用,加速学术写作和阅读

文章目录写作方面1.Jenni AI&#xff08;推荐&#xff09;2.Paperpal阅读方面3.Schoarlcy4.chatpdf5.Casper6.SciSpace&#xff08;推荐&#xff09;文献管理/写论文笔记用7.lateral8. ClioVis9.Glasp10. Audiopen学术目的的搜索引擎11. Consensus&#xff08;推荐&#xff09;…

【私有云盘】搭建PHP轻量文件管理器 - TinyFileManager「公网远程访问」

文章目录前言1. Tiny File Manager网站搭建1.1.Tiny file manager下载和安装1.2.Tiny file manager网页测试2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置3. 公网访问测试4. 结语前言 文件共享和查阅是现在网络最常见的应用场景&#x…

windows环境nodejs卸载与安装

windows环境nodejs卸载与安装一、卸载1.1 控制面板卸载程序1.2 手动清理相关文件夹二、安装2.1 下载安装包2.2 安装操作2.3 验证安装是否成功2.4 环境变量设置2.4.1 node程序添加到系统环境变量PATH2.4.2 修改全局模块下载路径2.4.2.1 node_global路径变量2.4.2.2 node_modules…

Docker应用部署

文章目录Docker 应用部署一、部署MySQL二、部署Tomcat三、部署Nginx四、部署RedisDocker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存…

【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。

系列文章目录 【Go语言从入门到精通系列-基础篇】Go安装 语言特性&#xff0c;以及开启你人生中的第一个go程序 【Go语言从入门到精通系列-基础篇】Go语言包的管理以及基础语法与使用。 Go语言从入门到精通系列-基础篇系列文章目录前言第二章 Go语言包的管理以及基础语法与使…

zabbix介绍 | 监控搭建和部署

zabbix介绍 | 监控搭建和部署一.Zabbix简介二.Zabbix监控原理三.Zabbix监控的最常见五个程序组件四&#xff0c;搭建zbx监控4.1准备二台虚拟机4.2 服务端客户端获取 zabbix 的下载源4.3 服务端安装修改 192.168.10.104.4 服务端安装 zabbix 所需的数据库&#xff08;192.168.10…

点监督的实例分割

目录Pointly-Supervised Instance Segmentation摘要方法Annotation format and collection训练点标记模型实验结果Pointly-Supervised Instance Segmentation 摘要 点注释来进行实例分割的弱监督标签除了边界框还有一组随机点对PointRend实例分割模块的修改对于每个对象&…

2020年 团体程序设计天梯赛——题解集

Hello各位童学大家好&#xff01;&#x1f60a;&#x1f60a;&#xff0c;茫茫题海你我相遇即是缘分呐&#xff0c;或许日复一日的刷题已经让你感到疲惫甚至厌倦了&#xff0c;但是我们真的真的已经达到了我们自身极限了吗&#xff1f;少一点自我感动&#xff0c;没有结果前别太…

Python爬虫基础之如何对爬取到的数据进行解析

目录1. 前言2. Xpath2.1 插件/库安装2.2 基础使用2.3 Xpath表达式2.4 案例演示2.4.1 某度网站案例3. JsonPath3.1 库安装3.2 基础使用3.2 JsonPath表达式3.3 案例演示4. BeautifulSoup4.1 库安装4.2 基础使用4.3 常见方法4.4 案例演示参考文献原文地址&#xff1a;https://www.…

OpenCV实例(二)手势识别

OpenCV实例&#xff08;二&#xff09;手势识别1.手势识别概述1.1.获取轮廓的凸包1.2.凸缺陷1.3.凸缺陷占凸包面积比2.手势识别过程2.1.识别流程3.石头、剪刀、布的识别作者&#xff1a;Xiou 1.手势识别概述 手势识别的范围很广泛&#xff0c;在不同场景下&#xff0c;有不同…

tp5实现导入excel表到数据库

hello&#xff0c;大家好&#xff0c;好长时间没有更新文章了。最近一直在忙着做项目。所以断更了。 那么好&#xff0c;各位老铁是否想要实现导入导出的功能 请关注我&#xff0c;解密如何实现导入导出&#xff0c; 那么今天先来讲一下用thinkphp5.0 如何实现Excel表格导入数据…

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解&#xff0c;实现入参数据自动验证 如果碰到 NotEmpty 否则不生效&#xff0c;注意看下 RequestBody 前面是否加上了Valid Validation常用注解汇总 Constraint详细信息Null被注释的元素必须为 nullNotNull被注释的元…

CentOS7.6 磁盘挂载

CentOS7.6 磁盘挂载 目录CentOS7.6 磁盘挂载1.磁盘说明2.磁盘分区步骤1.磁盘说明 1、Linux硬盘分IDE硬盘和SCSI硬盘&#xff0c;目前基本上是SCSI硬盘 2、对于IDE硬盘&#xff0c;驱动器标识符为"hdx"&#xff0c;""代表分区&#xff0c;前四个分区用数字…

selenium1—软件测试

文章目录1.什么是自动化测试2.如何实施自动化测试3.UI自动化测试的好处4.自动化框架5.为什么要选择selenium6.webdrive的原理7.selenium IDE1.什么是自动化测试 在预设的条件下&#xff08;自动化脚本&#xff09;运行系统&#xff0c;预设的条件包括正常的和异常的情况&#…

BGP反射器与联邦实验

基础配置 display ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 12.0.0.2/24 up up GigabitEthernet0/0/1 172.16.1.1/29 up up GigabitEthernet0/0/2 172.16.1.9/29 up up LoopBack0 172.16.2.1/24 up up(s) NULL0 unassigned up u…

AI 工具 22个使用场景、500个通用提问技巧说明

✏️ 「提问技巧—重点摘要」 「写作」&#xff1a;AI写作提问技巧 「制作视频」&#xff1a;AI制作视频创意提问相关技巧 【制定商业策略】&#xff1a;AI为各行各业制定商业策略提问技巧 【写邮件】&#xff1a;AI写邮件提问技巧 【框架方法论写内容】&#xff1a;AI利用…