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

RequestContextHolder 与 HttpServletRequest 的联系

1. 什么是 RequestContextHolder?

  • RequestContextHolderSpring 框架 提供的一个工具类,用于在当前线程中存储和获取与请求相关的上下文信息。
  • 它是基于 ThreadLocal 实现的,能够保证每个线程独立存储和访问请求信息。

与 HttpServletRequest 的关系:

HttpServletRequest

  • 是标准的 Servlet API 提供的类,用于表示一个 HTTP 请求。
  • 在 Controller 方法中,我们通常通过参数注入来获取它:
    @GetMapping("/example")
    public String example(HttpServletRequest request) {String param = request.getParameter("name");return "Parameter: " + param;
    }
    

RequestContextHolder

  • 是 Spring 对请求上下文的封装。
  • 它的核心是通过 RequestAttributes(Spring 自定义的接口)来间接操作 HttpServletRequest,从而获取请求信息。
  • 它的最大优势是:在 Service 层、过滤器、拦截器 等不能直接注入 HttpServletRequest 的地方,也能获取请求信息。

2. RequestContextHolder 与 HttpServletRequest 的联系

核心联系

  • RequestContextHolder 不会直接持有 HttpServletRequest,但它持有与请求相关的上下文信息。
  • 这个上下文信息是通过 RequestAttributes 实现的,而 ServletRequestAttributes 是它的一个实现类,封装了 HttpServletRequestHttpServletResponse

示意图

HttpServletRequest  ↓  
ServletRequestAttributes(封装 HttpServletRequest)  ↓  
RequestContextHolder(通过 ThreadLocal 保存 ServletRequestAttributes)
  • 当 Spring 处理请求时,它会将 HttpServletRequest 封装成 ServletRequestAttributes,然后绑定到当前线程的 ThreadLocal 中。
  • RequestContextHolder 就是通过 ThreadLocal 拿到 ServletRequestAttributes,再从中获取 HttpServletRequest

3. RequestContextHolder 的工作原理

绑定请求上下文

Spring 在处理 HTTP 请求时,会自动把 HttpServletRequest 封装成 ServletRequestAttributes 并绑定到线程中:

ServletRequestAttributes attributes = new ServletRequestAttributes(request);
RequestContextHolder.setRequestAttributes(attributes);

获取请求对象

我们可以通过 RequestContextHolder 拿到请求上下文,进一步获取 HttpServletRequest

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();

总结RequestContextHolder 是一个中间桥梁,它通过 ServletRequestAttributes 间接地连接到 HttpServletRequest


4. RequestContextHolder 提供的主要方法

获取请求上下文

getRequestAttributes():获取当前线程保存的请求上下文。

示例

RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
if (attributes instanceof ServletRequestAttributes) {HttpServletRequest request = ((ServletRequestAttributes) attributes).getRequest();System.out.println("请求参数:" + request.getParameter("name"));
}
  • 返回类型是 RequestAttributes,需要强转为 ServletRequestAttributes 才能拿到 HttpServletRequest

Spring 设计 RequestAttributes 作为一个 通用接口,这样可以支持不同类型的请求上下文,而不仅仅是 HTTP 请求。

  • RequestAttributes:定义了请求上下文的通用方法,不依赖于特定类型的请求。
  • ServletRequestAttributesRequestAttributes 的一个具体实现,专门封装 Servlet 环境 下的 HttpServletRequestHttpServletResponse

为什么需要强制转换?

因为 RequestAttributes 接口 是通用的,它不知道自己具体是什么请求类型(例如 Servlet 请求、Portlet 请求等)。

  • RequestAttributes 只提供了通用方法,比如存储和获取请求属性。
  • ServletRequestAttributes 提供了专门的方法,比如 getRequest()getResponse(),用于获取 HttpServletRequestHttpServletResponse

currentRequestAttributes()

  • getRequestAttributes() 类似,但如果没有请求上下文,它会抛出异常。

RequestContextHolder 提供的方法

方法作用
getRequestAttributes()获取当前线程绑定的 RequestAttributes,如果没有返回 null
currentRequestAttributes()获取当前线程的 RequestAttributes,如果没有会抛出异常。
setRequestAttributes(RequestAttributes)手动将 RequestAttributes 绑定到当前线程。适用于手动设置上下文的场景。
resetRequestAttributes()清除当前线程绑定的 RequestAttributes,防止内存泄漏。
setRequestAttributes(RequestAttributes, boolean inheritable)支持将请求上下文传递给子线程。inheritable = true 表示上下文可继承。

5. 使用场景及代码示例

场景 1:在 Service 层获取 HttpServletRequest

通常情况下,Service 层不能直接访问 HttpServletRequest,但可以通过 RequestContextHolder 获取:

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;public class RequestUtil {public static HttpServletRequest getCurrentRequest() {ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();return attributes != null ? attributes.getRequest() : null;}
}

使用

public void printRequestParam() {HttpServletRequest request = RequestUtil.getCurrentRequest();if (request != null) {String name = request.getParameter("name");System.out.println("请求参数 name:" + name);} else {System.out.println("无法获取 HttpServletRequest");}
}

场景 2:在异步线程中传递请求上下文

默认情况下,Spring 的请求上下文不会自动传递给新线程。需要手动设置:

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;public class AsyncRequestExample {public void processInAsyncThread() {// 获取当前请求上下文RequestAttributes attributes = RequestContextHolder.currentRequestAttributes();new Thread(() -> {try {// 绑定请求上下文到新线程RequestContextHolder.setRequestAttributes(attributes, true);// 获取 HttpServletRequestHttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();System.out.println("异步线程中获取请求参数:" + request.getParameter("name"));} finally {// 清理请求上下文,防止内存泄漏RequestContextHolder.resetRequestAttributes();}}).start();}
}

场景 3:过滤器或拦截器中设置请求上下文

在自定义的过滤器中手动设置请求上下文:

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class CustomFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 手动设置上下文RequestContextHolder.setRequestAttributes(new ServletRequestAttributes((HttpServletRequest) request));try {chain.doFilter(request, response);} finally {// 清理上下文,防止内存泄漏RequestContextHolder.resetRequestAttributes();}}
}

6. RequestContextHolder 的注意事项

  • 必须在请求线程中使用

    • RequestContextHolder 依赖于 ThreadLocal,只能在处理请求的线程中使用。
    • 如果在非 Web 环境或没有 HTTP 请求的线程中调用,会返回 null 或抛出异常。
  • 异步线程问题

    • 异步线程无法自动继承父线程的请求上下文,必须手动通过 setRequestAttributes 传递。
  • 内存泄漏风险

    • 在使用线程池时,如果不清理请求上下文(resetRequestAttributes),可能会导致内存泄漏。

相关文章:

RequestContextHolder 与 HttpServletRequest 的联系

1. 什么是 RequestContextHolder? RequestContextHolder 是 Spring 框架 提供的一个工具类,用于在当前线程中存储和获取与请求相关的上下文信息。它是基于 ThreadLocal 实现的,能够保证每个线程独立存储和访问请求信息。 与 HttpServletReq…...

力扣hot100——普通数组

53. 最大子数组和 class Solution { public:int maxSubArray(vector<int>& nums) {int n nums.size();int ans nums[0];int sum 0;for (int i 0; i < n; i) {sum nums[i];ans max(ans, sum);if (sum < 0) sum 0;}return ans;} }; 最大子数组和&#xf…...

本地部署大模型QPS推理测试

目录 1、测试环境1.1、显卡1.2、模型1.3、部署环境1.3.1、docker1.3.2、执行命令 2、测试问题2.1、20字左右问题2.2、50字左右问题2.3、100字左右问题 3、测试代码3.1、通用测试代码3.2、通用测试代码&#xff08;仅供参考&#xff09; 4、测试结果4.1、通用测试结果4.2、RAG测…...

内存、硬盘、DRAM、FLASH

内存 内存是计算机系统中用于临时存储和快速存取当前正在处理的数据和指令的组件&#xff0c;属于临时存储设备&#xff0c;它在计算机运行时用于存储活跃的程序和数据。内存的性能直接影响计算机的处理速度和响应能力。 内存的类型主要分为&#xff1a; DRAM&#xff08;动态随…...

全景图转6面体图 全景图与6面体图互转

目录 图片转360度全景中心图 依赖项: 库的使用方法: 源代码: 全景图拆成6面体图: 全景图,转6面体,再转全景图: 图片转360度全景中心图 原图: 效果图: 依赖项: pip install py360convert pip install numpy==2.2 库的使用方法: https://g...

【psutil模块02】Python运维模块之系统进程管理方法

系统进程管理方法 获取当前系统的进程信息&#xff0c;包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等。 1.进程信息 psutil.pids()获取所有PID,使用psutil.Process()接收单个进程的PID&#xff0c;获取进程名、路径、状态、系统资源等…...

Java-08

类的抽象是将类的实现和使用分离, 而类的封装是将实现的细节封装起来并且对用户隐藏,用户只需会用就行。 类的合约指的是从类外可以访问的方法和数据域的集合以及与其这些成员如何行为的描述 isAlive()方法的返回值类型为布尔型&#xff08;Boolean&#xff09;。这个方法用于…...

四轴用的无刷电机到底是属于直流电机还是交流电机?

四轴用的无刷电机因其高效、稳定、体积小巧等特点&#xff0c;成为了广泛应用的动力系统之一。尽管其名称中包含“直流”二字&#xff0c;但无刷电机到底是属于直流电机还是交流电机&#xff0c;这一问题常常引发人们的探讨与困惑。 一、无刷电机的工作原理 首先&#xff0c;…...

Redis中的Hot key排查和解决思路

什么是Hot key Hot key其实就是被频繁访问的key&#xff0c;比普通的key访问量要高于十倍或者几十倍不等。例如&#xff1a; QPS集中在特定的Key&#xff1a;实例的总QPS&#xff08;每秒查询率&#xff09;为10,000&#xff0c;而其中一个Key的每秒访问量达到了7,000。带宽使…...

CMake 保姆级教程(上)

整理自 视频 【CMake 保姆级教程【C/C】】 https://www.bilibili.com/video/BV14s4y1g7Zj/?p5&share_sourcecopy_web&vd_source6eb8f46d194c5ef9f89d3331f623a9c3 1、cmake简介 源文件&#xff08;.cpp / .c&#xff09;要经过 工具链 1.1 工具链 1、预处理&#…...

C++类模板的应用

template <class T> class mylist{ public: // 这是一个链表的节点 struct Link{ T val; Link* next; } 增 &#xff1a;insert(T val) 在链表中创建新节点&#xff0c;节点上保存的数据为 val 删&#xff1a;remove(T val) 移除链表中数据为 val 的节点 改: operator[](…...

Ubuntu 18.04无有线图表且无法设置有线网络

问题背景&#xff1a; 今天在登陆自己的虚拟机Ubuntu系统的时候突然出现 有线连接无法连接的问题&#xff0c;有线连接的图标变为没有了&#xff0c;无法点击网络菜单的Setting模块选项。我的虚拟机有线网络连接方式是NAT方式。 没有如下有线连接图标 解决方法&#xff1a; …...

QoS分类和标记

https://zhuanlan.zhihu.com/p/160937314 1111111 分类和标记是识别每个数据包优先级的过程。 这是QoS控制的第一步&#xff0c;应在源主机附近完成。 分组通常通过其分组报头来分类。下图指定的规则仔细检查了数据包头 &#xff1a; 下表列出了分类标准&#xff1a; 普通二…...

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日&#xff0c;TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…...

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址&#xff1a;杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日&#xff0c;由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会&#xff08;2024 Cloud AI Compute Ignite&…...

SimAI万卡集群模拟器,LLM大模型训练通信计算模拟

SimAI&#xff0c;是阿里巴巴构建的一个统一的模拟器&#xff0c;旨在大规模精确有效地模拟LLM训练过程。通过将训练框架、内核计算和集体通信库有选择地高保真集成到仿真过程中&#xff0c;SimAI在仿真中实现了高精度。 简单点来说&#xff0c;SimAI就是模拟&#xff0c;大模…...

Axure9设置画布固定

在使用AxureRP9设计原型时&#xff0c;如果遇到画布在拖动时变得难以控制&#xff0c;可以尝试在Windows系统中通过‘文件’>‘首选项’&#xff0c;或在Mac系统中通过‘AxureRP9’>‘偏好设置’进行设置&#xff0c;以稳定画布的行为。 现象 页面底层的画布&#xff0…...

window.getSelection() 获取划线内容并实现 dom 追随功能

功能&#xff1a;鼠标对一段文本中某些文字进行划线之后&#xff0c;需要在当前划线文本处出现一个功能按钮显示对划线内容进行操作&#xff0c;比如收藏、添加样本库等功能。 一、需要了解的鼠标事件对象属性 给 dom 元素注册鼠标事件之后&#xff0c;会有 event 属性&#…...

mybatis-plus超详细讲解

mybatis-plus &#xff08;简化代码神器&#xff09; 地址&#xff1a;https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …...

浏览器可以直接请求 websocket

一、原生支持 浏览器原生支持 WebSocket 协议&#xff0c;这使得开发者可以直接在 JavaScript 代码中使用 WebSocket 来建立与服务器的双向通信通道。 const socket new WebSocket("ws://localhost:8080");socket.addEventListener("open", function (e…...

* 和 .* 的区别(MATLAB)

在 MATLAB 中&#xff0c;* 和 .* 都是用来进行乘法操作的运算符&#xff0c;但它们有不同的应用场景。我们将从数学和编程的角度详细解析这两者的区别&#xff0c;并且讲解 MATLAB 中 . 运算符的其他常见用法。 1. * 和 .* 的区别 *&#xff1a;矩阵乘法&#xff08;线性代数…...

51c视觉~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12059371 #SaRA 修改一行代码就能实现高效微调&#xff01;上海交大&腾讯开源&#xff1a;兼顾原始生成和下游任务 仅修改一行训练代码即可实现微调过程。 文章链接&#xff1a;https://arxiv.org/pdf/2409.06633 …...

JVM虚拟机总揽

为什么 Java 要在虚拟机里运行&#xff1f; 先说结论&#xff1a; 可以一次编译&#xff0c;在各个硬件平台如 Windows_x64、Linux_aarch64&#xff09;都可以执行建立一个托管环境&#xff08;Managed Runtime&#xff09;&#xff0c;这个托管环境能够代替我们处理一些代码…...

PCL点云库入门——PCL库可视化之PCLVisualizer类显示复杂点云信息等(持续更新)

1、PCLVisualizer类可视化 PCLVisualizer类作为PCL库可视化到的高级功能&#xff0c;不仅支持点云等数据的可视化&#xff0c;还提供了丰富的交互功能和自定义选项&#xff0c;如颜色调整、视角切换、标注添加等。用户可以通过PCLVisualizer类轻松实现复杂的数据分析和处理任务…...

Hugface国内镜像

问题&#xff1a; urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /Salesforce/blip-image-captioning-base/resolve/main/preprocessor_config.json (Caused by ProxyError(Cannot connect to proxy.,…...

Vue3 重置ref或者reactive属性值

需要重新定义一个对象绑定复制给原对象 。 实例代码: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置对象值 const reset()>{Object.assign(formData, data()…...

前端的Python入门指南(完):错误和异常处理策略及最佳实践

《前端的 Python 入门指南》系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;常用语法和关键字对比&#xff08;二&#xff09;&#xff1a;函数的定义、参数、作用域对比&#xff08;三&#xff09;&#xff1a;数据类型对比 - 彻底的一切皆对象实现和包装对象异…...

c++:std::map下标运算符的不合理使用

这是我分析之前遗留代码时发现的一个隐藏点&#xff1b;不过我并不认为这样使用std::map是合理的。 看看简化后的代码&#xff0c;v1、v2的值应该是多少呢&#xff1f; #include <map>std::map<int, int> cm[2];int get_cm_value(int device, int ctrl) { auto …...

音频数据采样入门详解 - 给Python初学者的简单解释

音频数据采样入门详解 - 给Python初学者的简单解释 声音是如何变成数字的&#xff1f;什么是采样率&#xff1f;为什么要懂这个&#xff1f;Python小例子总结 大家好&#xff01;今天我们来聊一个有趣的话题&#xff1a;音频数据是如何在计算机中处理的。让我用最简单的方式来解…...

vue el-dialog实现可拖拉

el-dialog实现拖拉&#xff0c;每次点击度居中显示&#xff0c;以下贴出代码具体实现&#xff0c;我是可以正常拖拉并且每次度显示在中间&#xff0c;效果还可以&#xff0c;需要的可以丢上去跑跑 组件部分&#xff1a; <el-dialog:visible.sync"dialogVisible"…...

iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境

在 Objective-C 项目中设置 Dev、Staging 和 Prod 三个不同的环境&#xff0c;并为每个环境使用不同的 Bundle ID&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 创建不同的 Build Configuration 打开项目&#xff1a; 启动 Xcode 并打开你的项目。 选择项目文件&…...

开源实时多模态AI Agent,搭载Gemini多模态API(在线体验)

今天发现一个惊艳的开源项目&#xff0c;利用多模态大模型API进行多智能体交互。支持RAG、搜索等。 TEN Agent 是一款由 TEN 提供支持的对​​话式 AI&#xff0c;集成了 Gemini 2.0 Multimodal Live API、OpenAI Realtime API、RTC 等。它提供实时的看、听和说功能&#xff0…...

【持续更新】Github实用命令

Intro 最近高强度使用github&#xff0c;遂小计于此作为备忘。 Basic github是一个代码管理软件&#xff0c;能够track文件变动并且管理版本&#xff0c;是当代coding必不可少的工具。当你安装好github在本地以后&#xff0c;你可以通过以下命令初始化当前文件夹&#xff08…...

B树的性质和插入过程

性质 平衡性&#xff1a;所有叶子节点都在同一层多路&#xff1a;m 阶 B 树 最多&#xff1a; m 个分支&#xff0c;m-1 个元素 最少&#xff1a; 根节点 2 个分支 1个元素 其他节点 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ 个分支 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ −…...

分布式链路追踪-02-Dapper 论文介绍

开源项目 auto-log 自动日志输出 概要 现代互联网服务通常被实现为复杂的、大规模的分布式系统。 这些应用程序是由软件模块的集合构建的&#xff0c;这些模块可能由不同的团队使用不同的编程语言开发&#xff0c;并且可以跨越多个物理设施的数千台机器。 在这样的环境中&…...

python:用 sklearn 构建线性回归模型,并评价

编写 test_sklearn_6.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 估计器构建线性回归模型 """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import rcParamsfrom sklearn import dataset…...

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件&#xff0c;可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解&#xff0c;有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结&#xff1a; …...

Java String详解(三)

上一篇博客&#xff1a;Java String详解&#xff08;二&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blo…...

在pycharm2024.3.1中配置anaconda3-2024-06环境

version: anaconda3-2024.06-1 pycharm-community-2024.3.1 1、安装anaconda和pycharm 最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客 【2024最新版】超详细Pycharm安装保姆级教程&#xff0c;Pycharm环境配置和使用指南&#xff0c;看完这一篇就够了…...

从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)

前言&#xff1a;从这篇文章开始实现vue3vite的后台管理系统&#xff0c;记录下自己搭建后台系统图的过程。 这篇文章完成项目的初始化和基本配置&#xff0c;这一步可以直接跟着vue3官网进行。整个系列只有前端部分&#xff0c;不涉及后端。 vue3官网&#xff1a;https://cn.…...

升级thinkphp8最新版本,升级后发现版本不变

升级thinkphp8.0.3最新版本8.1.1&#xff0c;升级后发现版本不变&#xff0c; 更新TP有两个方法 1 全部更新(所有插件都一起更新) composer update 2 只更新TP框架核心 composer update topthink/framework 造成可能有两个原因&#xff0c;一是缓存问题&#xff0c;二是更新…...

PPP协议

PPP是一种常见的广域网数据链路层协议&#xff0c;主要用于在全双工的链路上进行点到点的数据传输封装&#xff0c;支持同步传输和异步传输&#xff0c;通常用于VPN和拨号上网 PPP 概述 PPP一般运行在serial串口上&#xff0c;是一种广域网协议&#xff0c;PPP建立分为LCP&a…...

JAVA基础:数据类型

JAVA基础:数据类型 强类型语言 强类型语言(Strongly Typed Language)是指在编程语言中,每个变量都必须有一个明确的类型,并且在编译时会进行类型检查。 JAVA是强类型语言,所有变量必须先定义后使用。 弱类型语言 弱类型语言(Weakly Typed Language)是指在编程中类…...

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…...

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…...

GeoIP介绍

文章目录 GeoIP1. GeoIP的详细介绍2. 在Go语言中使用GeoIP GeoIP GeoIP是一种技术&#xff0c;它允许通过IP地址来查询地理位置信息&#xff0c;如国家、地区、城市等。这种技术在网络安全、内容分发、市场分析等领域有着广泛的应用。 1. GeoIP的详细介绍 原理&#xff1a; …...

详述 BigDecimal 的错误计算

摘要 详细阐述在使用 Java 的 BigDecimal 类时&#xff0c;可能产生的错误计算。 据 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题-CSDN博客 介绍&#xff1a;“BigDecimal 的执行顺序不能调换&#xff08;乘法交换律失效&am…...

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…...

(三)PyQT5+QGIS+python使用经验——解决各版本不兼容问题

一、问题描述 基础环境&#xff1a;Windows10&#xff08;64&#xff09; PyCharm2024 QGIS 3.22。 目的&#xff1a;解决之前python版本多&#xff0c;pyqt5以及QT Designer交互使用存在环境变量冲突矛盾&#xff0c;以及QGIS安装时自带python、pyqt5等问题。 尤其是在QT …...

uniapp navigateTo、redirectTo、reLaunch等页面路由跳转方法的区别

uni.switchTab 跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 // app.json {"tabBar": {"list": [{"pagePath": "index","text": "首页"},{"pagePath": "other","text&…...