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

Spring Boot 中短时间连续请求时出现Cookie获取异常问题

Spring Boot 中短时间连续请求时出现Cookie获取异常问题

  • 一、问题描述:异步线程操作导致请求复用时 `Cookie` 解析失败
    • 1. 场景背景
    • 2. 问题根源
  • 二、问题详细分析
    • 1. 场景重现
    • 2. 问题分析
  • 三、如何避免影响下一次请求?
    • ✅方式 1:在主线程提前复制 `Cookie`(推荐)
    • ✅方式 2:使用 `HttpServletRequestWrapper` 包装 `request`(避免修改原始 request)
    • ✅方式 3:使用 ThreadLocal 传递 Cookie(适用于复杂场景)
  • 四、总结


一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败

在 Spring Boot Web 应用中,每个请求都会携带 HttpServletRequest,其中包含 Cookie 等关键信息。然而,由于 TomcatHttpServletRequest复用机制,如果某个请求对象的 cookieParsed 标记在异步线程中被错误修改,可能会导致 短时间内的后续请求无法正确解析 Cookie

1. 场景背景

在一个 Web 应用中,通常每个请求都会有一个 HttpServletRequest 对象来保存该请求的上下文信息。例如,HttpServletRequest 存储了请求中的 Cookie 信息。为了提高性能和减少内存使用,Web 容器(例如 Tomcat)会对 HttpServletRequest 对象进行复用。也就是说,当一个请求完成后,Tomcat 会将 HttpServletRequest 对象放回池中,供下一次请求使用。

为了避免每次请求都重复解析某些信息(例如 Cookie),开发人员可能会在主线程中解析并标记请求对象的状态,例如通过设置一个 cookieParsed 标志位,表明 Cookie 已经解析过。这一过程本来是为了避免重复的解析操作,但如果在异步线程中修改了请求的标志位,可能会影响到请求复用时的行为,导致下一个请求复用时出现问题。

2. 问题根源

  1. 异步线程操作请求对象: 当主线程解析完 HttpServletRequest 中的 Cookie 信息后,标记 cookieParsed 为“已解析”,然后启动一个异步线程执行一些长时间的任务,然后主线程执行完毕,进行HttpServletRequest 回收操作(例如:清空上下文信息,cookieParsed置为未解析状态)。由于 HttpServletRequest 是一个共享对象(在主线程和异步线程之间共享),异步线程可能会修改该请求对象的状态,例如将 cookieParsed 设置为“已解析”。

  2. 请求复用机制: 当前请求完成后,HttpServletRequest 会被回收并返回到请求池中,准备供下一个请求复用。在复用时,Tomcat 会检查当前请求对象的状态。如果上一个请求对象的 cookieParsed 被标记为“已解析”,则下一个请求在复用这个请求对象时会跳过 Cookie 的解析步骤,从而导致下一个请求无法正确获取 Cookie 信息。

  3. 标志位未重置: 由于在主线程结束后,cookieParsed 标志位被设置为“已解析”,但异步线程没有在任务完成后重置该标志位,导致请求对象在复用时被错误地标记为已经解析过 Cookie。这会直接影响到下一个请求的处理,导致 Cookie 解析失败直到该Request再次被回收,再次进行Request回收操作,才会正常

二、问题详细分析

1. 场景重现

  1. 主线程获取 HttpServletRequestCookie:主线程在处理 HTTP 请求时,首先从 HttpServletRequest 中解析出 Cookie 信息,并标记其解析状态。通常,Tomcat 会在请求完成后将请求对象回收。

  2. 异步线程启动:主线程结束后,将继续执行异步任务(例如,长时间的导出任务),在此过程中,异步线程会继续访问同一个 HttpServletRequest 对象。

  3. 请求复用:由于 Tomcat 对请求对象进行复用,当一个请求处理完后,它会将请求对象归还到池中,以便下一个请求复用。如果异步线程修改了请求的某些状态标志(例如标记 Cookie 已经解析),下一个请求可能会复用已经被修改过的 HttpServletRequest 对象。

  4. 数据污染问题:由于复用的请求对象已经被标记为“Cookie 已解析”,这个状态可能会被复用,导致下一次请求跳过 Cookie 的解析逻辑,导致获取到的 Cookienull,进而影响请求的数据处理。

代码示例:

public String handleRequest(HttpServletRequest request, HttpServletResponse response) {// 主线程开始执行,解析 Cookie 信息String cookieValue = null;Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("UID".equals(cookie.getName())) {cookieValue = cookie.getValue();break;}}}// 主线程完成后启动异步线程AsyncContext asyncContext = request.startAsync(request, response);new Thread(() -> {try {// 模拟延迟任务Thread.sleep(5000);// 异步线程尝试再次读取 Cookie,将回收后的request中的 `cookieParsed` 设置为“已解析”String cookieValueFromAsync = request.getCookies()[0].getValue();  System.out.println("异步线程中的 cookie: " + cookieValueFromAsync);asyncContext.complete();} catch (InterruptedException e) {e.printStackTrace();}}).start();return "success";
}

问题:

  • 当异步线程执行时,request已经被回收,request.getCookies() 返回的 Cookie 可能会是一个 空数组 或者是 错误的 Cookie。这时,即使请求中存在有效的 Cookie,异步线程依然无法获取到正确的值。

  • 同时被回收的request已经被异步线程标记为“Cookie 已解析”,导致下一次复用该request的请求跳过了 Cookie 的解析逻辑,造成下一次请求的获取Cookie为空。

2. 问题分析

  1. Tomcat 请求复用机制
  • Tomcat 在请求处理结束后并不会立即销毁 HttpServletRequest 对象,而是将其初始化后放入对象池中以供下一个请求复用。当请求完成后,如果异步线程访问了 HttpServletRequest,会继续使用主线程的请求对象。

  • 如果主线程处理完请求后,已经对 HttpServletRequest 标记了“Cookie 已解析”,这个状态可能会被复用,导致下一次请求跳过 Cookie 的解析。

  1. 异步线程与请求对象状态冲突
  • 异步线程和主线程虽然共享同一个 HttpServletRequest 对象,但异步线程修改了请求的状态(例如 cookieParsed 标志),就会影响其他线程访问请求数据的能力。

  • 这种情况下,下一个请求使用了已经标记为“Cookie 解析完毕”的请求对象,导致解析失败。

  1. 请求上下文传递失败
  • 在异步线程中,由于线程隔离,主线程中的 HttpServletRequest 无法自动传递到异步线程中。即使使用 AsyncContext 来延迟清理请求,HttpServletRequest 中的数据也可能无法正确传递给异步线程。
  1. 请求标志和清理机制
  • Tomcat 使用请求标志(如 cookieParsed 或者 requestCompleted)来追踪请求的状态,并在请求处理完成后清理请求资源。异步线程和主线程共享同一个请求对象时,可能会意外地修改这些标志,影响复用请求的正确性。

  • 一旦请求进入异步模式,Tomcat 会将其状态标记为“处理完成”,并通过 asyncContext.complete() 延迟清理请求对象。这种延迟清理机制会让异步线程继续持有原始的请求对象,造成请求标志的冲突和数据污染。

三、如何避免影响下一次请求?

为了避免 HttpServletRequest 的状态被修改,并正确地将请求上下文传递给异步线程,以下是推荐的几种解决方案。

✅方式 1:在主线程提前复制 Cookie(推荐)

避免异步线程访问 request,在主线程获取 Cookie 副本并传递给异步线程:

Cookie[] cookiesCopy = Arrays.copyOf(request.getCookies(), request.getCookies().length);AsyncContext asyncContext = request.startAsync();
new Thread(() -> {try {// 访问副本,避免修改原 requestString cookieValue = cookiesCopy[0].getValue();System.out.println("异步线程的 Cookie:" + cookieValue);} finally {asyncContext.complete();}
}).start();

优点:

  • 主线程 获取 Cookie,不会影响 request 内部状态。
  • 避免了 cookieParsed 被提前设置为 true

✅方式 2:使用 HttpServletRequestWrapper 包装 request(避免修改原始 request)

如果你需要保持 request 可用性,可以使用 HttpServletRequestWrapper 拦截 getCookies(),防止它影响 requestcookieParsed 状态:

class SafeRequestWrapper extends HttpServletRequestWrapper {private final Cookie[] cookiesCopy;public SafeRequestWrapper(HttpServletRequest request) {super(request);// 提前复制 cookie,避免影响原始 requestthis.cookiesCopy = request.getCookies() != null ?Arrays.copyOf(request.getCookies(), request.getCookies().length) : new Cookie[0];}@Overridepublic Cookie[] getCookies() {return cookiesCopy;}
}public String handleRequest(HttpServletRequest request, HttpServletResponse response) {HttpServletRequest safeRequest = new SafeRequestWrapper(request);AsyncContext asyncContext = request.startAsync();new Thread(() -> {try {String cookieValue = safeRequest.getCookies()[0].getValue();System.out.println("异步线程的 Cookie:" + cookieValue);} finally {asyncContext.complete();}}).start();return "success";
}

优点:

  • SafeRequestWrapper 拦截 getCookies(),防止 cookieParsed 状态变化。
  • 异步线程仍然可以像正常 request 一样获取 Cookie,但不会污染主 request

✅方式 3:使用 ThreadLocal 传递 Cookie(适用于复杂场景)

如果异步线程可能会在多个地方访问 request,可以使用 ThreadLocal 预先缓存 Cookie

private static final ThreadLocal<Cookie[]> threadLocalCookies = new ThreadLocal<>();public String handleRequest(HttpServletRequest request, HttpServletResponse response) {threadLocalCookies.set(request.getCookies()); // 复制 CookieAsyncContext asyncContext = request.startAsync();new Thread(() -> {try {Cookie[] cookies = threadLocalCookies.get();if (cookies != null) {String cookieValue = cookies[0].getValue();System.out.println("异步线程的 Cookie:" + cookieValue);}} finally {threadLocalCookies.remove(); // 避免内存泄漏asyncContext.complete();}}).start();return "success";
}

优点:

  • 避免异步线程访问 request,但仍然可以获取 Cookie 副本。
  • 避免 cookieParsed 状态修改,不会污染后续请求。
  • 适用于 异步任务复杂且可能跨多个方法调用的情况。

四、总结

在处理异步线程时,特别是涉及到 HttpServletRequest 等请求对象时,可能会遇到请求复用和上下文传递问题。通过合理地使用在主线程提前复制 Cookie、使用 HttpServletRequestWrapper 包装 request、使用 ThreadLocal 传递 Cookie或者直接传递参数等方法,可以有效避免数据污染和请求对象复用问题,从而确保异步任务中的请求数据正确性。

核心问题

  • 请求复用:Tomcat 会复用请求对象,导致异步线程访问到已经修改过的请求。

  • 异步线程访问不到请求数据:由于请求对象在异步线程执行时可能已经被清理或标记为“完成”,导致访问不到请求数据。

解决方案

方案适用场景优势可能的缺点
提前复制 Cookie(推荐)简单场景线程安全、性能好适用于 Cookie 访问较少的场景
HttpServletRequestWrapper需要完整 request 功能透明使用 request需要额外封装
ThreadLocal 传递 Cookie复杂异步任务适用于跨线程、跨方法需要手动清理 ThreadLocal

最佳实践:

  • 如果只是读取 Cookie,建议在主线程复制数据后传递(方式 1)。
  • 如果异步线程需要多个 request 方法,建议用 HttpServletRequestWrapper(方式 2)。
  • 如果异步任务复杂,可以用 ThreadLocal 维护副本(方式 3)。

这样就可以保证异步线程访问 Cookie 而不会影响 request 的复用! 🚀

相关文章:

Spring Boot 中短时间连续请求时出现Cookie获取异常问题

Spring Boot 中短时间连续请求时出现Cookie获取异常问题 一、问题描述&#xff1a;异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源 二、问题详细分析1. 场景重现2. 问题分析 三、如何避免影响下一次请求&#xff1f;✅方式 1&#xff1a;在主线程提前复制 …...

轮播图案例

&#xff08;1&#xff09;、搭建轮播图的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>轮播图结构</title><!-- <script src"../js/tools.js"></script> --…...

通俗版解释:分布式和微服务就像开餐厅

一、分布式系统&#xff1a;把大厨房拆成多个小厨房 想象你开了一家超火爆的餐厅&#xff0c;但原来的厨房太小了&#xff1a; 问题&#xff1a;一个厨师要同时切菜、炒菜、烤面包&#xff0c;手忙脚乱还容易出错。 解决方案&#xff1a; 拆分成多个小厨房&#xff08;分布式…...

【开源-常用C/C++命令行解析库对比】

以下是几种常用的C/C命令行解析库的对比表格&#xff0c;以及它们的GitHub开源库地址&#xff1a; 库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址ClaraC11及以上单一头文件&#xff0c;轻量级&#xff0c;非异常错误处理&#xff0c;自动类…...

JavaEE_多线程(一)

目录 1. 为啥要有线程1.1 线程是什么1.2 进程和线程的区别1.3 Java如何进行多线程编程 2 使用线程2.1 创建线程2.2 Thread类的几个常见方法和属性2.2.1 Thread常见构造方法2.2.2 Thread常见属性2.2.3 常见其他方法 2.3 终止一个线程2.3.1 通过共享的标记位来进行沟通2.3.2 调用…...

table 拖拽移动

表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...

【QGIS二次开发】地图显示与交互-01

1. 系统界面设计 设计的系统界面如下&#xff0c;很好还原了QGIS、ArcGIS等软件的系统界面&#xff0c;充分利用了QT中顶部工具栏、菜单栏、底部状态栏&#xff0c;实现了图层管理器、鹰眼图、工具箱三个工具面板。 菜单栏、工具栏、工具箱集成了系统中实现的全部功能&#x…...

Microsoft.Office.Interop.Excel 的简单操作

Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...

Debezium日常分享系列之:Debezium 3.0.8.Final发布

Debezium日常分享系列之&#xff1a;Debezium 3.0.8.Final发布 稀疏向量逻辑类型重命名架构历史配置默认值的更改潜在的 Vitess 数据丢失Oracle 的 Reselect 列后处理器行为更改MariaDB 的 SSL 连接 稀疏向量逻辑类型重命名 PostgreSQL 扩展 vector&#xff08;也称为 pgvecto…...

论传输层的TCP协议和UDP协议scoket通讯

TCP传输前需要三次握手---断开需要四次挥手 谁先发出请求、谁是客户端&#xff08;client&#xff09;另一个就是服务器&#xff08;server&#xff09;---简称CS架构 现在更多的是BS架构 什么是BS架构&#xff1f; blower server 浏览器服务器---也就是浏览器代替了客户端…...

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚页面效果📚指令输入定义…...

MySQL——DQL、多表设计

目录 一、DQL 1.基本查询 2.条件查询 3.分组查询 4.排序查询 5.分页查询 二、多表设计 1.一对多 2.一对一 3.多对多 一、DQL 1.基本查询 注意&#xff1a; *号代表查询所有字段&#xff0c;在实际开发中尽量少用&#xff08;不直观、影响效率&#xff09; 2.条件查询…...

【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

这篇文章发表于2024年4月 摘要 大语言模型&#xff08;LLMs&#xff09;的快速发展推动了多个领域的变革&#xff0c;重塑了通用人工智能的格局。然而&#xff0c;这些模型不断增长的计算和内存需求带来了巨大挑战&#xff0c;阻碍了学术研究和实际应用。为解决这些问题&…...

玩转大模型——Trae AI IDE国内版使用教程

文章目录 Trae AI IDE完备的 IDE 功能强大的 AI 助手 安装 Trae 并完成初始设置管理项目什么是 “工作空间”&#xff1f;创建项目 管理插件安装插件从 Trae 的插件市场安装从 VS Code 的插件市场安装 禁用插件卸载插件插件常见问题暂不支持安装 VS Code 插件市场中某个版本的插…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.3.1 避免频繁更新(Update by Query的代价)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch数据更新与删除深度解析&#xff1a;2.3.1 避免频繁更新&#xff08;Update by Query的代价&#xff09;案例背景1. Update by Query的内部机制解析1.1 文档更…...

stable-diffusion-webui 加载模型文件

背景 stable-diffusion-webui 安装完毕后&#xff0c;默认的模型生成的效果图并不理想&#xff0c;可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快&#xff0c;以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…...

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…...

SparkStreaming之04:调优

SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示&#xff1a; object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...

maven高级-05.私服

一.私服...

FFmpeg-chapter2-C++中的线程

1 常规的线程 一般常规的线程如下所示 // CMakeProject1.cpp: 定义应用程序的入口点。 //#include "CMakeProject1.h" #include <thread> using namespace std;void threadFunction(int index) {for (int i 0; i < 1000; i){std::cout << "Th…...

【前端】简单原生实例合集html,css,js

长期补充&#xff0c;建议关注收藏点赞。 目录 a标签设置不一样的花样&#xff08;图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样&#xff08;图片但不用img) a标签里面不用嵌套img&#xff0c;直接设置为其bg-img即可 <!DOCTYPE html…...

Linux下的shell指令(一)

作业 1> 在终端提示输入一个成绩&#xff0c;通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash read -p "请输入学生成绩:" score if [ "$score" -ge 90 ] && [ "$scor…...

AJAX介绍

XMLHttpRequest get请求使用 const xhr new XMLHttpRequest(); xhr.open("GET", "/data/test.json", true); xhr.onreadystatechange function () {if (xhr.readyState 4) {if (xhr.status 200) {alert(xhr.responseText);} else {console.log("…...

Serilog: 强大的 .NET 日志库

Serilog 是一个功能强大的日志记录库&#xff0c;专为 .NET 平台设计。它提供了丰富的 API 和可插拔的输出器及格式化器&#xff0c;使得开发者能够轻松定制和扩展日志记录功能。在本文中&#xff0c;我们将探索 Serilog 的基础知识、API 使用、配置和一些常见的示例。 1. 日志…...

串口通讯基础

第1章 串口的发送和接收过程 1.1 串口接收过程 当上位机给串口发送(0x55)数据时&#xff0c;MCU的RX引脚接受到&#xff08;0x55&#xff09;数据&#xff0c;数据(0x55)首先进入移位寄存器。数据全部进入移位寄存器后&#xff0c;一次将&#xff08;0x55&#xff09;全部搬运…...

SSL证书和HTTPS:全面解析它们的功能与重要性

每当我们在互联网上输入个人信息、进行在线交易时&#xff0c;背后是否有一个安全的保障&#xff1f;这时&#xff0c;SSL证书和HTTPS便扮演了至关重要的角色。本文将全面分析SSL证书和HTTPS的含义、功能、重要性以及它们在网络安全中的作用。 一、SSL证书的定义与基本概念 S…...

全国青少年航天创新大赛各项目对比分析

全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局&#xff0c;小学组3停泊处&#xff0c;初高中组6停泊处&#xff1b;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高&#xff0c;运…...

低空监视-无人机专用ADS-B应答机

产品简介 ping200XR是经过TSO适航认证的无人机专用ADS-B应答机&#xff0c;用于中大型无人机的低空监视。将经过认证的航空级航电设备引入无人机系统。该应答机支持航管二次雷达A&#xff0c;C/S模式和ADS-B OUT。重量仅52克满足无人机所面临的尺寸、重量、功耗的挑战&#xf…...

【linux】文件与目录命令 - sort

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 sort 命令用于对文本文件中的行进行排序&#xff0c;支持按字母顺序、数值大小、特定字段等方式进行排序。默认按字母顺序升序排序。 1. 基本用法 语法&#xff1a; sort [选项] 文件 sort [选项] -o 输出文件 文件功能…...

【工具推荐】在线提取PDF、文档、图片、论文中的公式

网址1&#xff1a;https://simpletex.cn/ai/latex_ocr 网址2: https://www.latexlive.com/home 推荐理由&#xff1a;无需下载&#xff0c;在线使用&#xff0c;直接 截图 CTRLV 效果更佳。...

大模型在垂直行业的落地实践:从通用到定制化的技术跃迁

大模型在垂直行业的落地实践&#xff1a;从通用到定制化的技术跃迁 一、通用大模型的局限性&#xff1a;从 “全能” 到 “专精” 的转型挑战 通用大模型&#xff0c;如 GPT 系列&#xff0c;凭借其强大的自然语言处理能力&#xff0c;在文本生成、语义理解、机器翻译等基础任…...

FPGA开发,使用Deepseek V3还是R1(1):应用场景

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

Docker概念与架构

文章目录 概念docker与虚拟机的差异docker的作用docker容器虚拟化 与 传统虚拟机比较 Docker 架构 概念 Docker 是一个开源的应用容器引擎。诞生于 2013 年初&#xff0c;基于 Go 语言实现。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xf…...

算法之数据结构

目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding...

Mysql学习笔记(六)Django连接MySQL

一、Django中的MySQL驱动程序 Python中常见的MySQL驱动程序&#xff1a; MySQL-python&#xff1a;就是MySQLdb&#xff0c;是对C语言操作MySQL的封装&#xff0c;支持Python2&#xff0c;不支持Python3mysqlclient:MySQL-python的另一个分支&#xff0c;支持Python3pymysql&am…...

手机号码归属地的实现

手机号码归属地查询一般可以通过以下几种方式实现&#xff1a; 1. 使用公开的号码归属地数据库 可以使用国内的手机号码归属地数据库&#xff0c;如&#xff1a; 百度号码归属地开放API阿里云号码归属地API腾讯号码归属地API 你可以在本地存储一个 CSV 或 SQLite 数据库&…...

本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成

前言 随着人工智能技术的迅猛发展&#xff0c;越来越多的开发者希望在本地环境中部署和调用 AI 模型&#xff0c;以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型&#xff0c;并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…...

2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 阿里云安全实习 一、代码审计经验与思路 二、越权漏洞原理与审计要点 三、SSRF漏洞解析与防御 四、教…...

WHAT - 前端异步事件流处理场景梳理

目录 一、典型场景二、解决方案与技术选型1. 基础异步控制2. 状态管理方案3. 复杂任务调度4. 任务取消机制5. 微任务队列优化 三、最佳实践建议四、工具链推荐 前端异步任务流处理是现代Web开发中常见的需求&#xff0c;尤其在复杂业务逻辑、高交互性应用中不可或缺。以下是常见…...

PHP 包含(Include)机制详解

PHP 包含(Include)机制详解 在PHP编程中,include和require是两个非常基础的函数,用于在脚本中包含其他文件。它们在模块化编程中发挥着至关重要的作用,使得代码更易于维护和扩展。本文将详细介绍PHP的包含机制,包括其工作原理、使用方法以及最佳实践。 一、PHP 包含机制…...

Metal学习笔记十:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…...

MongoDB 高级索引

MongoDB 高级索引 摘要 在数据库管理中,索引是提高查询效率的关键因素。MongoDB,作为一款流行的NoSQL数据库,其索引功能尤为强大。本文将深入探讨MongoDB的高级索引特性,包括复合索引、部分索引、文本索引、地理空间索引等,旨在帮助数据库管理员和开发者更好地利用Mongo…...

从DNS到TCP:DNS解析流程和浏览器输入域名访问流程

1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名&#xff0c;比如说CSDN的域名www.csdn.net&#xff0c;百度的域名www.baidu.com,我们也会碰到IP&#xff0c;现在目前有的是IPV4&#xff0c;IPV6。那这两个有什么区别呢&#xff1f;IP地址是互联网上计算机…...

【JQuery—前端快速入门】JQuery 基础语法

JQuery JQuery是一个快速、简洁且功能丰富的JavaScript框架; 1. 引入依赖 使用JQuery需要先引入对应的库&#xff1b; 在使用 JQuery CDN 时&#xff0c;只需要在 HTML 文档中加入如下代码 <script src"https://code.jquery.com/jquery-3.7.1.min.js"></s…...

即梦AI发布新数字人模型OmniHuman-1

简介 随着人工智能技术的发展&#xff0c;特别是深度学习和自然语言处理的进步&#xff0c;AI在内容创作领域的应用越来越广泛。字节跳动作为一家领先的科技公司&#xff0c;一直在探索如何利用AI技术来提升用户体验和创造力。OmniHuman-1模型正是在这种背景下诞生的&#xff…...

ARM CM3核 压栈流程

STM32F103 使用 ARM Cortex-M3 内核&#xff0c;与 STM32F013&#xff08;Cortex-M0&#xff09;相比&#xff0c;其压栈行为有所不同&#xff0c;主要体现在异常自动压栈和**手动压栈&#xff08;函数调用&#xff09;**两方面。 1. 进入异常/中断时的自动压栈 当 STM32F103 …...

WHAT - RxJS 异步事件流处理

目录 RxJS 关键概念简单示例常用操作符1. 创建 Observables2. 转换操作符&#xff08;map&#xff09;3. 过滤操作符&#xff08;filter&#xff09;4. 合并多个流&#xff08;mergeMap&#xff09; 适用于 React & TypeScriptReact 组件中使用 RxJS RxJS 是一个用于处理异…...

vue组合式API中prop

*一、了解(事件与$emit) 一个组件需要显示声明它所接受的props,这样才知道外部传入的那些是props,那些是透传attribute。 在<script setup>单文件组件中,props可以使用defineProps()宏来声明,defineProps 是一个仅 <script setup> 中可用的编译宏命令,并不需…...

【HarmonyOS Next】自定义Tabs

背景 项目中Tabs的使用可以说是特别的频繁&#xff0c;但是官方提供的Tabs使用起来&#xff0c;存在tab选项卡切换动画滞后的问题。 原始动画无法满足产品的UI需求&#xff0c;因此&#xff0c;这篇文章将实现下面页面滑动&#xff0c;tab选项卡实时滑动的动画效果。 实现逻…...