读取了Request输入流,请求数据就不见了

HttpServletRequest 和 HttpServletResponse 中存在方法互斥。

在过滤器、拦截器中对 HTTP 请求中的数据做校验、审计是非常常见的需求

Request 输入流数据一但被读取,Controller找不到了

Request 的 getlnputStream 和 getReader 都只能使用一次

1673180331517-3d74c53a-443a-4067-a2d5-2ddd3301430b.png

请求数据解析工具:

1673180394883-7ae106eb-e832-4ac2-9c6a-7d6aefa8f096.png

1673180480829-68c27892-3e6e-456c-a027-a3e477074e19.png

1673180451061-396923cc-107b-45a7-996b-3b4621dc3451.png

定义拦截器:

1673180578586-a1504dc9-b134-4a1f-ac14-1ee0f61f5e84.png

1673180616903-a1739504-ab24-46e0-9356-d961897fd98a.png

1673180656122-56f21b84-afc2-49ad-a850-5e021d29929e.png

发起请求:

1673180714648-7818821d-79b6-42d2-8172-577b69c3287c.png

Request的 getlnputStream、 getReader、 getParameter 方法互斥,也就是使用了其中一个,再使用另外的两个,是获取不到数据的。

Response 也是一样的,与 Request 几乎是一样的

互斥效果的原理:

1673180962520-3a99f64d-2e6e-43fa-8b7f-21525f659eab.png

1673180997510-06ceaf2b-00a9-4c32-962d-dd4cc937cf90.png

getParameter 内部也会判断:

1673181047909-b84572d4-2e1b-4209-8ae9-c215739427c5.png

无法重复读取的原理

读取完坐标没有重置:

getReader 也是没有重置坐标

1673180889368-4e1da559-da3b-4997-94ac-80259b5f7d21.png

HttpServletRequestWrapper + Filter 解决输入流不能重复读取问题

其实是包装器模式,实现对请求数据的包装。

自定义请求包装器:

1673181153597-c20d3ce2-422f-4e77-af6d-31e8b94e4310.png

每次获取数据的时候都是重新从数组里面获取

1673181192009-fac8f54c-c110-465a-9b66-164263c20d95.png1673181219354-6e6b65cb-5777-4174-9e2c-f2f6c89726ad.png

这个方法直接调用上面重写的 getInputStream ,相当于也是每次从数组里面重新获取:

1673181241756-e9baca2b-8207-4a29-b990-b071c5df9b38.png

定义过滤器:

让输入流可以重复读取,在 doFilter 里将对应的 Request 替换为对应的 wrapper

1673181276883-669bac5c-3a12-4e2f-8cae-b614a9f370cc.png

1673181313032-2a7b1252-5602-4654-9570-53c19bcc8156.png

posted on 2025-10-14 23:48  chuchengzhi  阅读(7)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客