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

DotNetPy:现代.NET 与 Python 互操作 实战指南道

我为什么会发出这个疑问呢是因为我研究Web开发中的一个问题时HTTP请求体在 Filter过滤器处被读取了之后在 Controller控制层就读不到值了使用 RequestBody 的时候。无论是字节流InputStream / OutputStream还是字符流Reader / Writer所有基于流的读取操作都会维护一个 位置指针。初始状态下指针指向流的起始位置position 0每次调用 read() / read(byte[]) / read(char[]) 等读取方法时指针会向后移动对应字节数当指针移动到流的末尾没有更多数据read() 方法会返回 -1表示流读取完毕指针移动后不会自动回退也无法反向移动除非流显式支持重置因此再次读取只能得到 -1。类比IO 流的读取过程就像用 磁带播放器听磁带 —— 磁头对应流的位置指针从磁带开头指针 0开始移动每读一个字节 / 字符磁头就往后走一步当磁头走到磁带末尾再继续播放读取就只能听到 沙沙声流返回 -1并且磁头不会自动回到开头。当然不是所有流都只能读一次基于内存的流如 ByteArrayInputStream / CharArrayReader支持重置指针因为它们的数据源是内存中的数组数据不会消失可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。需要注意调用 reset() 前必须先调用 mark(int readlimit)不是所有流都支持 mark() / reset()可以通过 inputStream.markSupported() 来进行判断。使用 mark() 和 reset() 方法// 仅适用于支持mark的流public void processWithMark(InputStream input) throws IOException {if (!input.markSupported()) {throw new IOException(Mark not supported);}// 标记当前位置参数100表示最多可回退100字节input.mark(100);// 第一次读取byte[] firstRead new byte[50];input.read(firstRead);System.out.println(First read: new String(firstRead));// 重置到标记位置input.reset();// 第二次读取相同内容byte[] secondRead new byte[50];input.read(secondRead);System.out.println(Second read: new String(secondRead));}使用 包装类 解决上文我们提到的 HTTP请求体多次读取 的问题public class MyRequestWrapper extends HttpServletRequestWrapper {private final byte[] body; // 缓存请求体的字节数组public MyRequestWrapper(HttpServletRequest request) throws IOException {super(request);// 关键步骤在构造时一次性读取并存储原始请求流body StreamUtils.copyToByteArray(request.getInputStream());}// 提供一个便捷方法用于在过滤器中获取请求体内容例如记录日志// 使用时直接调用 getBodyString() 即可public String getBodyString() throws UnsupportedEncodingException {return new String(body, this.getCharacterEncoding());}Overridepublic ServletInputStream getInputStream() throws IOException {// 每次调用都返回一个基于缓存数据的新流ByteArrayInputStream bais new ByteArrayInputStream(body);return new ServletInputStream() {Overridepublic int read() {return bais.read();}Overridepublic boolean isFinished() {return bais.available() 0;}Overridepublic boolean isReady() {return true;}Overridepublic void setReadListener(ReadListener readListener) {// 无需实现}};}Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream(), this.getCharacterEncoding()));}}然后在 过滤器 处包装请求Slf4jConfigurationpublic class RequestCachingFilterConfig {Beanpublic FilterRegistrationBean requestCachingFilter() {FilterRegistrationBean registrationBean new FilterRegistrationBean();// 核心创建过滤器包装请求为 ContentCachingRequestWrapperregistrationBean.setFilter(new OncePerRequestFilter() {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 1. 仅包装 HTTP 请求排除 WebSocket 等if (request instanceof HttpServletRequest !(request instanceof ContentCachingRequestWrapper)) {log.info(进入requestCachingFilter);// 2. 包装请求自动缓存请求体MyRequestWrapper wrappedRequest new MyRequestWrapper(request);filterChain.doFilter(wrappedRequest, response); // 传递包装后的请求} else {filterChain.doFilter(request, response); // 无需包装直接放行}}});// 3. 配置拦截所有请求可根据需求调整 URL 模式registrationBean.addUrlPatterns(/*);registrationBean.setOrder(1); // 优先级最高确保先于其他过滤器执行registrationBean.setName(requestCachingFilter);return registrationBean;}}IO 流只能读取一次是 精心设计的贴合操作系统文件 / 网络 IO 的 顺序消费 特性保持和底层系统的一致性。邢撬敌欣

相关文章:

DotNetPy:现代.NET 与 Python 互操作 实战指南道

我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...

Java对接腾讯云KMS:FISCO BCOS联盟链私钥托管的完整实战指南

一、引言 在FISCO BCOS联盟链的企业级应用中,私钥安全始终是生产环境绕不开的核心问题。FISCO BCOS作为国产开源联盟链平台,其Java SDK在为区块链应用开发者提供便捷API的同时,也带来了一个关键问题:私钥如何安全存储与使用? 用于交易签名的私钥由业务模块负责安全加载(…...

如何用memtest_vulkan专业检测显卡内存稳定性:新手必读指南

如何用memtest_vulkan专业检测显卡内存稳定性:新手必读指南 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 显卡内存稳定性是影响图形性能和系统可靠…...

CompressO终极指南:如何免费压缩95%视频和图片存储空间

CompressO终极指南:如何免费压缩95%视频和图片存储空间 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO …...

LaTeX新手必看:5个Word用户最常踩的排版坑及LaTeX解决方案

LaTeX新手必看:5个Word用户最常踩的排版坑及LaTeX解决方案 当你第一次从Word切换到LaTeX时,可能会感到既兴奋又困惑。Word的所见即所得(WYSIWYG)界面让我们习惯了通过点击按钮来调整格式,而LaTeX则需要通过代码来控制排…...

fSpy终极指南:5分钟学会免费开源3D相机匹配神器

fSpy终极指南:5分钟学会免费开源3D相机匹配神器 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy 在3D建模、建筑可视化和影视特效领域,如何将2D照…...

别再只测功能了!手把手教你为数据防泄露系统设计一份实战测试用例(附WinPE、虚拟机等16个场景)

数据防泄露实战测试:从高危场景到防御验证的完整指南 当企业核心代码库在深夜被批量下载到某个境外IP时,安全团队往往要等到审计警报响起才发现问题。更令人不安的是,我们最近对50家科技公司的调研显示,83%的内部数据泄露都发生在…...

PDF Arranger:5分钟掌握开源PDF页面编排工具的核心技巧

PDF Arranger:5分钟掌握开源PDF页面编排工具的核心技巧 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive grap…...

彻底告别Windows Defender烦恼:开源控制工具让你的电脑真正属于你

彻底告别Windows Defender烦恼:开源控制工具让你的电脑真正属于你 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-con…...

基于深度学习的遥感图像识别 遥感识别数据集 YOLO11旋转图像目标检测 遥感图像旋转目标球场检测系统设计

文章目录YOLO11 遥感图像旋转目标球场检测系统设计摘要二、系统架构与关键技术YOLO11 遥感图像旋转目标球场检测系统设计 摘要 随着遥感技术的发展,利用高分辨率卫星或无人机获取的图像进行地物识别和分类变得越来越重要。特别地,对于体育设施如足球场…...

AI 上线前的验收清单,你可能一条都没做

点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群上一篇讲了 Eval——怎么判断你的 AI 是变好了还是变差了。但 Eval 告诉你的是"好不好",不是"能不能放出去"。 能放出去,是一个工程问题,不…...

常见问题划重点|Google Play Games Level Up 计划

Google Play Games Level Up 计划旨在发掘并奖励玩家体验出色的游戏,提供各种强大的工具和推广资源来助力您的游戏业务蓬勃发展。我们将为您推出有关 Level Up 计划的系列精彩内容,欢迎您关注 #Level Up 计划内容合集。Google Play 始终致力于挖掘那些能…...

终极网页转Markdown工具:MarkDownload高效内容提取全攻略

终极网页转Markdown工具:MarkDownload高效内容提取全攻略 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload…...

从原理到代码:深入理解STM32的SDIO时钟分频与FatFS性能优化

从原理到代码:深入理解STM32的SDIO时钟分频与FatFS性能优化 在嵌入式开发中,SD卡存储方案因其高容量和便携性成为数据记录的首选。但许多开发者在使用STM32的SDIO接口时,常遇到读写速度不稳定、初始化失败等问题。这背后往往隐藏着对SDIO时钟…...

VLM位置编码的‘三驾马车’:深入解读Interleaved MRoPE背后的位置一致性、频率利用与文本先验保留

VLM位置编码的‘三驾马车’:深入解读Interleaved MRoPE背后的位置一致性、频率利用与文本先验保留 当视觉语言模型(VLM)试图理解一张包含"左上角有只猫,右下角有只狗"的图片时,它如何确保不会将猫和狗的位置…...

Umi-OCR终极指南:开源免费离线OCR的完整实战方案

Umi-OCR终极指南:开源免费离线OCR的完整实战方案 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。…...

Betaflight飞控系统:如何通过3个关键步骤解决你的无人机飞行难题?

Betaflight飞控系统:如何通过3个关键步骤解决你的无人机飞行难题? 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 你是否曾经在飞行中遭遇机身抖动、响应迟钝或者…...

Mybatisplus 找不到分页组件

Mybatisplus的pom升级3.5.9后找不到分页组件类PaginationInnerInterceptor&#xff0c;挣扎一番发现需要单独导入一个pom&#xff0c;代码如下<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-jsqlparser</artifactId><…...

MetaWRAP数据库安装卡在下载?试试这个Aspera ascp参数详解与速度优化方案

MetaWRAP数据库下载卡顿&#xff1f;Aspera ascp参数深度调优指南 当你在深夜的实验室服务器前&#xff0c;盯着屏幕上缓慢蠕动的进度条——那个已经持续了8小时的NCBI数据库下载任务&#xff0c;突然意识到生物信息学研究中最耗时的可能不是分析代码运行&#xff0c;而是等待数…...

终极指南:如何用ExplorerPatcher解决Windows 11兼容性问题并个性化你的桌面

终极指南&#xff1a;如何用ExplorerPatcher解决Windows 11兼容性问题并个性化你的桌面 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你是否…...

QuickBMS终极指南:三步掌握游戏文件提取与修改的免费神器

QuickBMS终极指南&#xff1a;三步掌握游戏文件提取与修改的免费神器 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS QuickBMS是一款革命性的通用文件提取工具&#xff0c;专为游戏资源提取、逆…...

尝试以底层角度,理解c++代码书写逻辑

大家好&#xff0c;现在是4月10号下午6点7分&#xff0c;又来写blog了&#xff01;废话不多说&#xff0c;我来写写要将内容的大纲&#xff1a;一&#xff1a;由c转为c时&#xff0c;写代码时出现的困惑二&#xff1a;实验性理论开发之路三&#xff1a;理论哈哈&#xff0c;就三…...

WeChatMsg完整教程:微信聊天记录永久保存与深度分析终极指南

WeChatMsg完整教程&#xff1a;微信聊天记录永久保存与深度分析终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

前端状态管理:别让你的应用状态一团糟

前端状态管理&#xff1a;别让你的应用状态一团糟 什么是前端状态管理&#xff1f; 前端状态管理是指管理前端应用中数据状态的方法和工具。别以为状态管理只是简单的变量存储&#xff0c;复杂的应用状态管理不当会让你的代码变成一团糟。 为什么需要状态管理&#xff1f; 统一…...

新手必看:Qwen3-Reranker-0.6B部署避坑指南与常见问题

新手必看&#xff1a;Qwen3-Reranker-0.6B部署避坑指南与常见问题 1. 为什么选择Qwen3-Reranker-0.6B 1.1 轻量高效的语义重排序模型 Qwen3-Reranker-0.6B是阿里云推出的轻量级重排序模型&#xff0c;仅有0.6B参数&#xff08;约6亿&#xff09;&#xff0c;但性能表现优异。…...

996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹

996引擎 - [开发辅助] 利用 robocopy 同步项目 dev 文件夹 代码 git 管,资源统一放内网服务器。 使用以下脚本同步 岗位 同步方向 需求 策划 本地 >>> 内网服务器 提交资源 美术 本地 >>> 内网服务器 提交资源 程序 内网服务器 >>> 本地 拉取资源 …...

AI直播背景替换终极指南:OBS智能抠像插件完整教程

AI直播背景替换终极指南&#xff1a;OBS智能抠像插件完整教程 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://gitc…...

如何用ExifToolGUI解决数字照片元数据管理难题:5个专业工作流优化方案

如何用ExifToolGUI解决数字照片元数据管理难题&#xff1a;5个专业工作流优化方案 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui ExifToolGUI是一款基于ExifTool的图形化元数据管理工具&#xff0c;专为摄…...

【UE4/UE5 萌新向】有C++基础如何快速入门虚幻引擎?超详细图文全揭秘!

观众老爷们大家好 我是邪修KING 欢迎来到我的TA->UE游戏引擎博客—入门篇&#xff01; C&#xff01;高门槛&#xff01;精选学习&#xff01;前言 如果你和我一样&#xff0c;刚刚啃完了C语言、数据结构&#xff0c;并且掌握了C的类和对象和STL&#xff0c;现在看着电脑里刚…...

我试了四种去除 Gemini 水印的方法,整理成一篇实用对比野

认识Pass层级结构 Pass范围从上到下一共分为5个层级&#xff1a; 模块层级&#xff1a;单个.ll或.bc文件 调用图层级&#xff1a;函数调用的关系。 函数层级&#xff1a;单个函数。 基本块层级&#xff1a;单个代码块。例如C语言中{}括起来的最小代码。 指令层级&#xff1a;单…...