springboot 通过OncePerRequestFilter获取参数json
时间: 2025-01-21 16:22:50 浏览: 60
### 实现方案
为了在 `OncePerRequestFilter` 中读取并处理 HTTP 请求体中的 JSON 数据,可以采用缓冲区复制的方式保存原始请求体内容。这样即使已经读取过一次请求体,在后续的过滤器链或其他组件中仍然能够正常访问到完整的请求体。
具体实现方式是在自定义的 `OncePerRequestFilter` 子类里重写 `doFilterInternal()` 方法,并在此处创建一个新的 `ContentCachingRequestWrapper` 对象来包裹原有的 HttpServletRequest 。通过这种方式可以在不破坏原有输入流的情况下完成对请求体数据的操作[^1]。
下面给出具体的代码示例:
```java
import org.apache.commons.io.IOUtils;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JsonRequestLoggingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
String requestBody = IOUtils.toString(wrappedRequest.getReader());
// 打印日志或做其他操作...
System.out.println("Intercepted Request Body: " + requestBody);
try {
super.doFilterInternal(wrappedRequest,response,filterChain);
} finally {
// 清理工作...
}
}
}
```
这段代码展示了如何利用 Apache Commons IO 库的帮助函数将请求体转换成字符串形式以便于查看和记录;同时也说明了应当怎样正确地调用父类的方法继续执行剩余的过滤器链条[^2]。
另外需要注意的是,对于 POST 或 PUT 这样的带有实体主体(即有请求体)的请求来说,应该确保所使用的 Wrapper 类型支持多次读取 InputStream 和 Reader 接口返回的数据流。这里选择了 Spring 自带的 `ContentCachingRequestWrapper` 来满足这一需求[^3]。
阅读全文
相关推荐




















