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

GitHub 悄悄起飞的开源项目,想让 AI 接管你的电脑断

我为什么会发出这个疑问呢是因为我研究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 的 顺序消费 特性保持和底层系统的一致性。谏涎徘叶

相关文章:

GitHub 悄悄起飞的开源项目,想让 AI 接管你的电脑断

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

BMV31M304A语音模块:I²C接口嵌入式语音播放方案

1. BMV31M304A语音播放模块深度技术解析BMV31M304A是由BEST MODULES CORP推出的专用IC接口语音播放模块,面向嵌入式系统设计,尤其适用于需要低成本、低功耗、即插即用语音提示功能的工业HMI、智能家电、安防设备及教育类开发板。该模块并非通用音频解码芯…...

终极KCC多设备兼容指南:Kindle、Kobo、ReMarkable全支持的漫画转换神器

终极KCC多设备兼容指南:Kindle、Kobo、ReMarkable全支持的漫画转换神器 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc KCC(Ki…...

简明教程:实现OpenCLaw轻量级应用服务器部署及Ollama大模型本地化蓉

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…...

Graphormer开源镜像保姆级教程:3.7GB纯Transformer模型GPU快速部署

Graphormer开源镜像保姆级教程:3.7GB纯Transformer模型GPU快速部署 1. 为什么选择Graphormer? Graphormer是微软研究院开发的基于纯Transformer架构的图神经网络模型,专门用于分子属性预测任务。与传统的图神经网络(GNN)相比,它…...

Chainlit+Qwen1.5-1.8B-GPTQ-Int4构建私有AI助手:支持文件上传与内容问答教程

ChainlitQwen1.5-1.8B-GPTQ-Int4构建私有AI助手:支持文件上传与内容问答教程 1. 学习目标与前置准备 今天我们来学习如何搭建一个功能强大的私有AI助手,这个助手不仅能进行智能对话,还能读取你上传的文件并回答相关问题。想象一下&#xff…...

终极PEFT技术教程:用少量数据高效微调大模型的完整指南

终极PEFT技术教程:用少量数据高效微调大模型的完整指南 【免费下载链接】notebooks Notebooks using the Hugging Face libraries 🤗 项目地址: https://gitcode.com/gh_mirrors/note/notebooks GitHub 加速计划 / note / notebooks项目提供了丰富…...

如何让Application Inspector完美识别C、Java、Python等多语言代码?全面解析与实用指南

如何让Application Inspector完美识别C、Java、Python等多语言代码?全面解析与实用指南 【免费下载链接】ApplicationInspector A source code analyzer built for surfacing features of interest and other characteristics to answer the question Whats in the …...

NaViL-9B惊艳效果:多页PDF截图拼接理解+跨页语义关联分析

NaViL-9B惊艳效果:多页PDF截图拼接理解跨页语义关联分析 1. 模型能力概览 NaViL-9B作为原生多模态大语言模型,在文档理解领域展现出独特优势。不同于常规图文模型仅能处理单页内容,它具备两大核心能力: 多页PDF截图拼接理解&am…...

DeepSeek-OCR-2部署案例:私有云OpenStack平台OCR服务容器化部署

DeepSeek-OCR-2部署案例:私有云OpenStack平台OCR服务容器化部署 1. 项目背景与价值 在数字化转型的浪潮中,文档数字化处理成为企业提升效率的关键环节。传统的OCR技术往往面临识别精度不足、处理速度慢、部署复杂等问题,特别是在私有云环境…...

Hive数据库入门指南:5分钟学会Flutter极速键值存储

Hive数据库入门指南:5分钟学会Flutter极速键值存储 【免费下载链接】hive Lightweight and blazing fast key-value database written in pure Dart. 项目地址: https://gitcode.com/gh_mirrors/hive/hive Hive是一款轻量级且速度极快的纯Dart键值数据库&…...

终极Pi-Hole域名白名单配置指南:3种列表的实战应用与优化技巧

终极Pi-Hole域名白名单配置指南:3种列表的实战应用与优化技巧 【免费下载链接】whitelist A simple tool to add commonly white listed domains to your Pi-Hole setup. 项目地址: https://gitcode.com/gh_mirrors/wh/whitelist GitHub 加速计划&#xff0…...

一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API廖

一、前言:什么是 OFA VQA 模型? OFA(One For All)是字节跳动提出的多模态预训练模型,支持视觉问答、图像描述、图像编辑等多种任务,其中视觉问答(VQA)是最常用的功能之一——输入一张…...

打造专属API网关监控中心:Konga自定义仪表盘完全指南

打造专属API网关监控中心:Konga自定义仪表盘完全指南 【免费下载链接】konga More than just another GUI to Kong Admin API 项目地址: https://gitcode.com/gh_mirrors/ko/konga Konga作为Kong API网关的强大管理界面,不仅提供了基础的API管理功…...

esp32-snippets自定义扩展:如何基于现有代码构建自己的工具库

esp32-snippets自定义扩展:如何基于现有代码构建自己的工具库 【免费下载链接】esp32-snippets Sample ESP32 snippets and code fragments 项目地址: https://gitcode.com/gh_mirrors/es/esp32-snippets esp32-snippets是一个包含丰富ESP32代码片段和示例的…...

PROJECT MOGFACE Keil5开发效率提升:工程配置自动化与调试脚本生成

PROJECT MOGFACE Keil5开发效率提升:工程配置自动化与调试脚本生成 你是不是也经历过这样的场景?拿到一块新的STM32开发板,比如最常见的STM32F103,兴冲冲地打开Keil5准备大干一场,结果第一步就被卡住了——新建工程、…...

基于Qwen3-ASR-1.7B的智能录音笔方案:离线语音转写实现

基于Qwen3-ASR-1.7B的智能录音笔方案:离线语音转写实现 语音转写技术正逐步从云端走向终端,Qwen3-ASR-1.7B为嵌入式设备提供了本地化语音识别的可能性 1. 方案设计思路 传统的录音笔只能记录音频,后期需要导入电脑并通过联网服务才能转换成文…...

GLM-OCR在网络安全中的应用:恶意软件截图与钓鱼网站界面分析

GLM-OCR在网络安全中的应用:恶意软件截图与钓鱼网站界面分析 最近和几个做安全的朋友聊天,他们都在抱怨一个事儿:每天要处理海量的恶意软件截图和钓鱼网站页面,眼睛都快看花了。这些图片里藏着大量关键信息,比如勒索软…...

彻底搞懂Type Challenges中的Chunk类型:从入门到精通

彻底搞懂Type Challenges中的Chunk类型:从入门到精通 【免费下载链接】type-challenges Collection of TypeScript type challenges with online judge 项目地址: https://gitcode.com/GitHub_Trending/ty/type-challenges Type Challenges是一个专注于TypeS…...

Alerta高可用部署方案:Docker、Kubernetes与云平台最佳实践

Alerta高可用部署方案:Docker、Kubernetes与云平台最佳实践 【免费下载链接】alerta Alerta monitoring system 项目地址: https://gitcode.com/gh_mirrors/al/alerta Alerta监控系统是一款功能强大的开源告警管理工具,能够帮助运维团队集中处理各…...

告别生硬过渡:用Pop实现丝滑手势交互的3个实战技巧

告别生硬过渡:用Pop实现丝滑手势交互的3个实战技巧 【免费下载链接】pop An extensible iOS and OS X animation library, useful for physics-based interactions. 项目地址: https://gitcode.com/gh_mirrors/po/pop Pop是一款强大的iOS和OS X动画库&#x…...

终极指南:如何使用Excelize实现高效多列排序与自定义排序规则

终极指南:如何使用Excelize实现高效多列排序与自定义排序规则 【免费下载链接】excelize Go language library for reading and writing Microsoft Excel™ (XLAM / XLSM / XLSX / XLTM / XLTX) spreadsheets 项目地址: https://gitcode.com/gh_mirrors/ex/exceli…...

DeepSeek-OCR实战应用:物流单据智能处理方案

DeepSeek-OCR实战应用:物流单据智能处理方案 1. 物流行业的OCR需求与挑战 1.1 物流单据处理的痛点分析 物流行业每天产生海量的运单、发票、签收单等纸质单据,传统人工录入方式面临三大核心问题: 效率瓶颈:平均每张单据需要3-…...

如何用NES.css打造复古游戏风表单提交反馈:完整微交互指南

如何用NES.css打造复古游戏风表单提交反馈:完整微交互指南 【免费下载链接】NES.css NES-style CSS Framework | ファミコン風CSSフレームワーク 项目地址: https://gitcode.com/gh_mirrors/ne/NES.css NES.css作为一款经典的红白机风格CSS框架,让…...

OpenSimpleLidar开源激光雷达:低成本DIY扫描测距仪完全指南

OpenSimpleLidar开源激光雷达:低成本DIY扫描测距仪完全指南 【免费下载链接】OpenSimpleLidar Open Source scanning laser rangefinder 项目地址: https://gitcode.com/gh_mirrors/op/OpenSimpleLidar OpenSimpleLidar是一款开源激光雷达项目,专…...

终极指南:Nodeclub社区系统的自动化测试全攻略

终极指南:Nodeclub社区系统的自动化测试全攻略 【免费下载链接】nodeclub :baby_chick:Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统 项目地址: https://gitcode.com/gh_mirrors/no/nodeclub Nodeclub是使用Node.js和MongoDB开发的社区系统&#xff0…...

Maud快速入门指南:5分钟学会使用Rust宏编写HTML模板

Maud快速入门指南:5分钟学会使用Rust宏编写HTML模板 【免费下载链接】maud :pencil: Compile-time HTML templates for Rust 项目地址: https://gitcode.com/gh_mirrors/ma/maud Maud是Rust的HTML模板引擎,通过html!宏将标记编译为专门的Rust代码…...

如何快速上手Hackberry-Pi_Zero:从开箱到运行的10个简单步骤

如何快速上手Hackberry-Pi_Zero:从开箱到运行的10个简单步骤 【免费下载链接】Hackberry-Pi_Zero A handheld Linux terminal using Raspberry pi Zero 2W as Core with 4" 720X720 TFT display 项目地址: https://gitcode.com/gh_mirrors/ha/Hackberry-Pi_Z…...

TensorFlow.js手势识别避坑指南:HandPose模型在React Native中的特殊适配

TensorFlow.js手势识别在React Native中的工程化实践:从原理到性能优化 移动端手势交互正在重塑人机交互体验,而React Native开发者面临的核心挑战在于:如何将浏览器环境优化的TensorFlow.js模型无缝迁移到跨平台场景。本文将深入解析HandPos…...

Open NSynth Super软件架构:openFrameworks音频应用深度剖析

Open NSynth Super软件架构:openFrameworks音频应用深度剖析 【免费下载链接】open-nsynth-super Open NSynth Super is an experimental physical interface for the NSynth algorithm 项目地址: https://gitcode.com/gh_mirrors/op/open-nsynth-super Open…...