Java重写HttpServletRequestWrapper ,解决getInputStream()只能获取一次数据流的问题
2023-09-27 14:24:43 时间
项目基于springboot开发,RestFull接口向外暴露的API需要进行签名验证,即在进入真正controller方法前,需要先验证接口请求的有效性,所以需要对提交的POST流进行JSON读,并将相关参数进行验签。
package com.joshua317.blog.web.frame.filter; import org.springframework.util.StreamUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * @author joshua317 on 2022/01/12 */ public class ResetRequestWrapper extends HttpServletRequestWrapper { private byte[] requestBody = null; public ResetRequestWrapper(HttpServletRequest request) throws IOException { super(request); //重点就是这里,把获取到的流数据重新复制给一个对象 requestBody = StreamUtils.copyToByteArray(request.getInputStream()); } @Override public ServletInputStream getInputStream() { final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody); return new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() { return bais.read(); // 读取 requestBody 中的数据 } }; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } }
相关文章
- 深入解析Java重写 - 返回值、修饰符必须一致?
- 地址重写--Java中urlrewriter的使用
- Java基础-重写-子类重写父类中的方法后执行情况
- Java传递程序员变量
- Effective Java 第三版——13. 谨慎地重写 clone 方法
- 两步验证杀手锏:Java 接入 Google 身份验证器实战
- Java--Reflect(反射)专题1——class 类的使用
- Java 重写方法与初始化的隐患
- java读取XML文件的四种方法总结(必看篇)
- Java方法重写小笔记
- 将Java项目从maven迁移到gradle
- JAVA查出来的时间与数据库时间不一致,相差14个小时
- Java Token登录验证 使用jjwt生成和解析JWT
- Stream In Java
- 我的第一个Java程序和Java简介
- 第三十一章:Java编程实战-做个博客系统(2)
- Java中方法的重写与成员变量的隐藏