Spring Boot过滤器链:从入门到精通
文章目录
- 一、过滤器链是什么?
- 二、为什么需要过滤器链?
- 三、Spring Boot中的过滤器链是如何工作的?
- (一)过滤器的生命周期
- (二)过滤器链的执行流程
- 四、如何在Spring Boot中定义自己的过滤器?
- 五、如何控制过滤器的顺序?
- 六、Spring Security中的过滤器链
- 七、过滤器链的性能优化
- 八、总结
在当今的Web开发中,Spring Boot凭借其简洁高效的特性,成为了众多开发者的首选框架。而过滤器链作为Spring Boot中一个重要的概念,对于保障应用的安全性和功能完整性起着关键作用。今天,就让我们一起深入了解Spring Boot中的过滤器链,从入门到精通,一步步揭开它的神秘面纱。
一、过滤器链是什么?
在Spring Boot中,过滤器链(Filter Chain)是由一系列过滤器(Filter)组成的有序集合。这些过滤器按照一定的顺序依次对请求进行处理,每个过滤器都可以对请求进行拦截、修改或增强操作,从而实现诸如安全检查、日志记录、请求转发等功能。过滤器链的设计使得我们可以将不同的功能模块化,通过组合多个过滤器来实现复杂的功能逻辑,同时保持代码的清晰和可维护性。
二、为什么需要过滤器链?
在Web应用中,我们常常需要在请求到达业务逻辑之前或之后执行一些通用的操作。例如,在请求到达控制器之前,我们可能需要验证用户的身份、记录请求的日志;在响应返回给客户端之前,我们可能需要对响应内容进行压缩或加密。如果这些操作都直接写在业务逻辑代码中,会导致代码的耦合度很高,难以维护和扩展。而过滤器链的出现,正是为了解决这个问题。通过将这些通用操作封装到不同的过滤器中,并按照一定的顺序组织成过滤器链,我们可以在不修改业务逻辑代码的情况下,灵活地添加或修改这些通用操作,从而提高代码的可维护性和可扩展性。
三、Spring Boot中的过滤器链是如何工作的?
(一)过滤器的生命周期
在Spring Boot中,每个过滤器都遵循一个标准的生命周期,主要包括以下三个阶段:
- 初始化(init):当过滤器被创建时,Spring会调用过滤器的init方法。在这个方法中,我们可以进行一些初始化操作,例如加载配置文件、初始化资源等。不过,在Spring Boot中,由于过滤器通常是通过Spring的依赖注入机制进行管理的,因此我们很少需要手动实现init方法。
- 过滤(doFilter):这是过滤器的核心方法,当请求到达过滤器时,Spring会调用doFilter方法。在这个方法中,我们可以对请求进行拦截、修改或增强操作。例如,我们可以在doFilter方法中验证用户的身份,如果用户未登录,则直接返回401状态码;如果用户已登录,则继续调用下一个过滤器。doFilter方法的参数包括ServletRequest、ServletResponse和FilterChain,其中FilterChain表示过滤器链的下一个过滤器,通过调用FilterChain的Filterdo方法,可以将请求传递给下一个过滤器。
- 销毁(destroy):当过滤器被销毁时,Spring会调用过滤器的destroy方法。在这个方法中,我们可以进行一些清理操作,例如关闭资源、释放内存等。和init方法一样,在Spring Boot中,我们也很少需要手动实现destroy方法。
(二)过滤器链的执行流程
当一个请求到达Spring Boot应用时,Spring会按照过滤器链中过滤器的顺序依次调用每个过滤器的doFilter方法。每个过滤器都可以对请求进行处理,然后通过调用FilterChain的doFilter方法将请求传递给下一个过滤器。如果某个过滤器不想让请求继续传递下去,它可以选择不调用FilterChain的doFilter方法,从而直接返回响应给客户端。例如,如果一个过滤器发现用户未登录,它可以直接返回401状态码,而不再调用下一个过滤器。
过滤器链的执行流程可以用以下伪代码来表示:
filterChain.doFilter(ServletRequest request, ServletResponse response) {for (Filter filter : filters) {filter.doFilter(request, response, new FilterChain() {@Overridepublic void doFilter(ServletRequest request, ServletResponse response) {// 调用下一个过滤器FilterChain.doFilter(request, response);}});}
}
从这个伪代码中可以看出,过滤器链的执行是一个递归的过程,每个过滤器都负责调用下一个过滤器的doFilter方法,直到所有的过滤器都执行完毕,请求才会最终到达业务逻辑代码。
四、如何在Spring Boot中定义自己的过滤器?
在Spring Boot中,定义自己的过滤器非常简单。我们只需要创建一个类,让它实现javax.servlet.Filter接口,然后在类上添加@Component注解,让Spring能够自动扫描并注册这个过滤器。以下是一个简单的自定义过滤器示例:
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Component
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作System.out.println("MyFilter初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 在请求到达业务逻辑之前执行的操作System.out.println("MyFilter请求前处理");HttpServletRequest httpRequest = (HttpServletRequest) request;System.out.println("请求路径:" + httpRequest.getRequestURI());// 调用下一个过滤器chain.doFilter(request, response);// 在响应返回给客户端之前执行的操作System.out.println("MyFilter响应后处理");}@Overridepublic void destroy() {// 销毁操作System.out.println("MyFilter销毁");}
}
在上面的代码中,我们定义了一个名为MyFilter的过滤器。在doFilter方法中,我们在请求到达业务逻辑之前打印了一条日志,并获取了请求的路径;在响应返回给客户端之前,我们又打印了一条日志。通过在类上添加@Component注解,Spring会自动扫描并注册这个过滤器,将其加入到过滤器链中。
五、如何控制过滤器的顺序?
在Spring Boot中,过滤器链中过滤器的执行顺序是由过滤器的优先级决定的。默认情况下,Spring会按照过滤器的类名的字典顺序对过滤器进行排序。但是,我们可以通过实现Ordered接口或使用@Order注解来指定过滤器的优先级。优先级越小,过滤器越先执行。
以下是一个使用@Order注解指定过滤器优先级的示例:
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.servlet.*;
import.io java.IOException;@Component
@Order(1)
public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("FirstFilter初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FirstFilter请求前处理");chain.doFilter(request, response);System.out.println("First响应Filter后处理");}@Overridepublic void destroy() {System.out.println("FirstFilter销毁");}
}@Component
@Order(2)
public class SecondFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("SecondFilter初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("SecondFilter请求前处理");chain.doFilter(request, response);System.out.println("SecondFilter响应后处理");}@Overridepublic void destroy() {System.out.println("SecondFilter销毁");}
}
在上面的代码中,我们定义了两个过滤器FirstFilter和SecondFilter,并通过@Order注解分别指定了它们的优先级为1和2。因此,在过滤链器中,FirstFilter会先于SecondFilter执行。
六、Spring Security中的过滤器链
Spring Security是Spring Boot中用于实现安全认证和授权的框架,它也使用了过滤器链来实现各种安全功能。Spring Security的过滤器链中包含了许多预定义的过滤器,例如SecurityContextPersistenceFilter用于在请求开始时恢复安全上下文,在请求结束时清理安全上下文;UsernamePasswordAuthenticationFilter用于处理基于用户名和密码的登录请求;ExceptionTranslationFilter用于处理安全相关的异常,例如用户未登录或没有权限访问某个资源等。
通过自定义过滤器并将其加入到Spring Security的过滤器链中,我们可以扩展Spring Security的功能,实现自己的安全需求。例如,我们可以通过自定义一个过滤器来实现基于JWT(JSON Web Token)的认证机制,或者通过自定义一个过滤器来实现对请求的访问控制。
以下是一个将自定义过滤器加入到Spring Security过滤器链中的示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(new MyCustomFilter(), UsernamePasswordAuthenticationFilter.class).authorizeRequests().anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}
}
在的上面代码中,我们通过addFilterBefore方法将自定义的MyCustomFilter加入到了Spring Security的过滤器链中,并指定它在UsernamePasswordAuthenticationFilter之前执行。这样,我们就可以在用户登录之前对请求进行处理,例如验证请求的来源是否合法等。
七、过滤器链的性能优化
虽然过滤器链为我们提供了强大的功能,但是过多的过滤器或不合理的过滤器链设计可能会对应用的性能产生影响。以下是一些优化过滤器链性能的建议:
减少不必要的过滤器:只在真正需要的地方使用过滤器,避免在每个请求上都执行不必要的操作。例如,如果某个过滤器只对特定的请求路径有效,可以通过在doFilter方法中添加路径匹配逻辑来减少不必要的调用。
优化过滤器的实现:在过滤器的doFilter方法中,尽量减少对资源的占用和对性能的影响。例如,避免在过滤器中进行复杂的计算或大量的I/O操作。
合理安排过滤器的顺序:将那些可以快速拒绝请求的过滤器放在前面,例如安全过滤器或权限过滤器,这样可以减少不必要的后续处理。
使用异步过滤器:如果过滤器的操作可以异步执行,可以考虑使用AsyncFilter来提高性能。异步过滤器可以在不阻塞主线程的情况下执行耗时操作,从而提高应用的并发能力。
八、总结
通过本文的介绍,我们从过滤器链的基本概念出发,逐步深入到了Spring Boot中过滤器链的实现原理、定义方法、顺序控制以及与Spring Security的结合等方面。过滤器链作为一种强大的功能,可以帮助我们实现各种通用的操作,提高代码的可维护性和可扩展性。然而,在使用过滤器链时,我们也需要注意性能优化,避免对应用的性能产生负面影响。
相关文章:
Spring Boot过滤器链:从入门到精通
文章目录 一、过滤器链是什么?二、为什么需要过滤器链?三、Spring Boot中的过滤器链是如何工作的?(一)过滤器的生命周期(二)过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++中的智能指针
智能指针总结 智能指针其作⽤是管理⼀个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,类会…...
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini) 📊 引言 近年来,AI 编程助手已成为开发者的高效工具,它们可以加速代码编写、优化代码结构,并提供智能提示。本文介绍如何在 IntelliJ I…...
【R语言】非参数检验
一、Mann-Whitney检验 在R语言中,Mann-Whitney U检验(也称为Wilcoxon秩和检验)用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验,适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...
PyTorch 源码学习:阅读经验 代码结构
分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同,所以笔者在整理资料时尽可能按版本号升序,版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...
04运维实用篇(D4_日志)
目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1:添加日志记录操作 步骤2:设置日志输出级别 步骤3:设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...
Linux文件管理:硬链接与软链接
文章目录 1. 硬链接的设计目的(1)节省存储空间(2)提高文件管理效率(3)数据持久性(4)文件系统的自然特性 2. 软链接的设计目的**(1)跨文件系统引用****&#x…...
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
以耳倾听世间繁华,以语表达心中所想 大家好,我是whisperrrr. 前言: 大家好,我是你们的朋友whisrrr。在日常工作中,MySQL作为一款广泛使用的开源关系型数据库,其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...
小米平板怎么和电脑共享屏幕
最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的,需要下载一款电脑安装包:小米妙享 关于这个安装包,想吐槽的是: 没有找到官网渠道,是通过其他网络方式查到下载的 不附录链接,原因是因为地…...
宝藏软件系列 篇一:My APK(Android)
文章目录 系列文章官方网站特色功能同类软件 系列文章 官方网站 My APK 官方版本是在 谷歌商店 中上架的。 官方下载地址:Google Play 商店页面。(需要外网) 2025.2最新版本的CSDN本地下载地址(因为是Android App Bundle&…...
本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例
本地部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例 Ollama 部署 Deepseek R1 官网:https://www.deepseek.com/ Github:https://github.com/deepseek-ai Ollama:https://ollama.com/ Docker Compose 部署一个 Ollama 和…...
centos8.0 docker ngnix
问题1:镜像拉取不下来,用DAO云加速器 问题2:ngnix镜像不能运行, 无法检索OCI运行时错误 在CentOS上使用Docker来运行Nginx是一个常见的做法,因为它提供了快速、一致的环境配置方式,并且可以很容易地扩展。…...
位运算在数据库中的运用实践-以MySQL和PG为例
目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时,遇到一个很有意思的场景。首先先跟大家分享一下需…...
IoTDB 常见问题 QA 第五期
关于 IoTDB 的 Q & A 情人节之际,让 IoTDB Q&A 陪您一起共度解惑!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:导入…...
【kafka系列】日志存储设计 消息写入、读取
目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计,其结构包含目录组织、…...
Python实现语音识别详细教程【2025】最新教程
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程,涵盖环境搭建、使…...
【一文读懂】HTTP与Websocket协议
HTTP协议 概述 HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏…...
SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下,人们的精神需求愈发凸显࿰…...
Windows逆向工程入门之堆栈结构与信息获取
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 1. 堆栈结构基础 堆栈的主要操作: 2. 代码功能解析 2.1 加载 ntdll.dll 2.2 获取 NtQueryInformationThread 函数指针 2.3 调用 NtQueryInformationThread 获取线程信息…...
springboot项目如何部署到tomcat中
1、使用springboot内部嵌入的tomcat 可以改一些tomcat的参数 2、可以把springboot项目打包为war包,然后部署到tomcat中去 Spring Boot 默认使用嵌入式 Tomcat 作为其 Web 容器,这使得 Spring Boot 应用可以作为一个独立的 JAR 文件运行。这种嵌入式服务…...
C语言之easyX
目录 概要 easyX整体架构 图形绘制 画布宽高 圆形 图片的贴图 加载图像 游戏框架 概要 easyX是一个轻量级的图形库,用于在Windows平台上进行简单的2D图形绘制。它提供了一组简单易用的函数,可以方便地绘制基本的图形元素,如线条、矩形、圆形…...
es6箭头函数和普通函数的区别
在JavaScript中,函数是执行特定任务的代码块。函数可以被定义并且随后被调用。JavaScript中有两种主要的函数定义方式:普通函数声明和箭头函数表达式。下面是这两种函数的定义方式及其区别和使用场景: 普通函数声明 普通函数可以通过函数声明…...
DeepSeek R1 32B 本地部署实战
#DeepSeek# DeepSeek是一款基于人工智能的智能助手,专为提升工作效率和信息获取能力而设计。它结合了自然语言处理、机器学习和大数据技术,能够快速理解用户需求并提供精准的答案或解决方案。 DeepSeek的核心功能 智能问答 DeepSeek可以回答各种问题&…...
八、SPI读写XT25数据
8.1 SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于嵌入式系统中连接微控制器与外围设备,如传感器、存储器、显示屏等。 主要特点 1. 全双工通信:支持同时发送…...
AIP-145 范围
编号145原文链接AIP-145: Ranges状态批准创建日期2020-05-28更新日期2020-05-28 服务通常需要表示具体值或连续值的范围。这些范围的含义存在诸多差异,也存在许多数据类型:整数、浮点数、时间戳等(在此仅举几例)。根据所讨论范围…...
(学习总结24)Linux 基本命令2
Linux 基本命令2 操作文件或目录命令更改文件或目录访问权限命令 chmod修改文件的所有者和所属组命令 chown修改文件或目录的所属组命令 chgrp更改文件或目录的属性命令 chattr创建文件和目录时的默认权限掩码命令 umask判断文件类型命令 file显示文件或文件系统状态命令 stat树…...
WPF-数据转换器
一、单值转换器 1.不传参数 转换器 当Value值大于100时返回红色 public class DataConverter : IValueConverter{/// <summary>/// 表示从源到目标数据转换/// </summary>/// <param name"value">数据源的值</param>/// <param name&q…...
STM32 I2C通信协议说明
目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况: 异常情况: 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…...
网络工程师 (42)IP地址
一、定义与功能 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。这种地址分配方式确保了用户在连网的计算机上操作时,能够高效且方便地从众多计算机中选出自己所需…...
Deepseek实用万能提问模板
一,背景需求约束条件 背景:提供与问题相关的时间、地点、人物、事件等信息,帮助 DeepSeek 更好地理解问题的情境。 需求:清晰明确地阐述你希望 DeepSeek完成的任务或提供的信息。 约束条件:可根据具体情况,对回答的范围、格式、字数等进行…...
强化学习笔记7——DDPG到TD3
前提:基于TD 的方法多少都会有高估问题,即Q值偏大。原因两个:一、TD目标是真实动作的高估。 二:自举法高估。 DDPG 属于AC方法:异策略,适合连续动作空间,因为他的策略网络直接输出的动作&#…...
传统混合专家模型MoE架构详解以及python示例(DeepSeek-V3之基础)
我们已经了解到DeepSeek-V3的框架结构基于三大核心技术构建:多头潜在注意力(MLA)、DeepSeekMoE架构和多token预测(MTP)。而DeepSeekMoE架构的底层模型采用了混合专家模型(Mixture of Experts,MoE)架构。所以我们先了解一下传统混合专家模型MoE架构。 一、传统混合专家模…...
开源协议深度解析:理解MIT、GPL、Apache等常见许可证
目录 前言1. MIT协议:自由而宽松的开源许可1.1 MIT协议的主要特点1.2 MIT协议的适用场景 2. GPL协议:自由软件的捍卫者2.1 GPL协议的核心理念2.2 GPL协议的适用场景 3. Apache License 2.0:开源与专利保护的平衡3.1 Apache License 2.0的主要…...
三维重建(十二)——3D先验的使用
文章目录 零、最近感受和前言一、使用能够快速得到重建初始化的方法1.1 Colmap(多视角)1.2 深度估计(单视角)二、已知形状模板2.1 人脸2.2 人体2.3 动物三、刚性与非刚性约束(变形约束)3.1 刚性变形3.2 非刚性变形四、统计(深度学习)先验——从大量(3D)数据中提取信息…...
Java项目《苍穹外卖》BUG修复记录
一、订单详情地址显示为null 原因:查看订单详情接口中,未设置收货地址信息,故地址返回为null。 解决方案: 1、OrderServiceImpl中创建一个私有方法专门获取订单收货地址 /*** 获取订单收获地址* param addressBookId* return*/…...
DockerDesktop更改默认的磁盘镜像地存储位置
DockerDesktop更改默认的磁盘镜像地存储位置 文章目录 DockerDesktop更改默认的磁盘镜像地存储位置1. 默认存储位置2. 新建一个目录3. 将磁盘镜像存储位置改为新建的目录下 1. 默认存储位置 2. 新建一个目录 如:D:\DiskImagelocationData 3. 将磁盘镜像存储位置改为…...
阿里云视频点播,基于thinkphp8上传视频
前端参考官方示例(jQuery版) <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>阿里云 JavaScript上传SDK Demo (使用jquery)</title><script src"__STATIC__/jquery.min.js"></script><sc…...
C# windowForms 的DataGridView控件的使用
C# Windows Forms DataGridView 控件使用详解 DataGridView 是 Windows Forms 中用于显示和编辑表格数据的核心控件。它支持高度自定义的列类型、数据绑定、事件处理和丰富的样式配置。以下是其详细使用方法。 目录 基础使用 数据绑定 列类型与自定义...
【NLP 22、语言模型 language model】
有时候我也想听听,我在你心里,是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的,也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲,语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…...
vtkCamera类的Dolly函数作用及相机拉近拉远
录 1. 预备知识 1.1.相机焦点 2. vtkCamera类的Dolly函数作用 3. 附加说明 1. 预备知识 要理解vtkCamera类的Dolly函数作用,就必须先了解vtkCamera类表示的相机的各种属性。 VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如…...
2025 N1CTF crypto 复现
近一个月都没有学习了,一些比赛也没有打,很惭愧自己还是处在刚放假时的水平啊,马上开学了,抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…...
大模型开发实战篇5:多模态--文生图模型API
大模型文生图是一种基于人工智能大模型的技术,能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道,有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口࿰…...
Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改
本文目录 前言功能预览样式特点总结:1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结:1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…...
Macos机器hosts文件便捷修改工具——SwitchHosts
文章目录 SwitchHosts软件下载地址操作添加方案切换方案管理方案快捷键 检测 SwitchHosts SwitchHosts 是一款 Mac 平台上的免费软件,它可以方便地管理和切换 hosts 文件,支持多种 hosts 文件格式。 软件下载地址 SwitchHosts 操作 添加方案 添加 …...
vLLM专题(四)-故障排除
本文件概述了一些您可以考虑的故障排除策略。如果您认为发现了一个 bug,请首先搜索现有的问题,看看是否已经有人报告。如果没有,请提交一个新问题,并尽可能提供相关的详细信息。 注意 一旦您调试完问题,请记得关闭任何已定义的调试环境变量,或者简单地启动一个新 shell,…...
搜广推校招面经十七
滴滴 花小猪 一、算法题1—最小覆盖字串(hot100_字串_困难) 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 ## form collection import Counter …...
滚动弹幕案例
滚动弹幕案例 一、需求 1.页面上漂浮字体大小不一、颜色不一,从左向右滚动的弹幕; 2.底部中间有一个发送功能,可以发送新的弹幕; 3.底部的发送部分可以向下收起和弹出。 二、html <div class"container"><…...
Typora导出word文件详细安装教程
在 Typora 中,部分文件格式(包括 docx、odt、rtf、epub、LaTeX 和 wiki)的导入和导出功能由第三方软件 Pandoc 提供支持。这些功能需要安装 Pandoc (≥ v2.0)。 一、安装Pandoc 下载地址:通过网盘分享的文件:pandoc 链…...
从短片到长片:王琦携《Mountain》续作迈向新高度
在王琦(Qi Wang)的带领下,广受关注的短片《Mountain》迎来了成长篇续作《Rite of the Mountain》。这一全新长片不仅是她从短片迈向长篇叙事的重要一步,更是一次大胆的艺术挑战。作为制片人的她,将继续以敏锐的视觉风格和深刻的叙事洞察,拓展《Mountain》所触及的情感深度,并构…...