上一节《Spring Boot 3.x Filter实战:记录请求日志》实践最后遇到了request
对象的流不可重复读的问题,本小节我们将通过流数据缓存以及流的装饰器模式来解决这个问题。如果觉得对你有帮助,记得点赞收藏,关注小卷,后续更精彩!
装饰流操作对象
我们知道,在Java
语言的流模块设计中大量采用了装饰器模式,来扩展流的特性。这里我们同样会对接收字节数组流数据的ByteArrayInputStream
对象进行包装,将其作为一个从ServletInputStream
扩展的CachedServletInputStream
类型对象的成员变量,进行缓存。看下代码实现:
package com.juan.demo.common.web.support.servlet;
import ...
@Slf4j
public class CachedServletInputStream extends ServletInputStream {
private final InputStream cachedInputStream;
public CachedServletInputStream(byte[] cachedByteArray) {
this.cachedInputStream = new ByteArrayInputStream(cachedByteArray);
}
@Override
public boolean isFinished() {
try {
return cachedInputStream