HttpServletRequestWrapper存储Request

HTTP请求的输入流只能被读取一次,再想获取就获取不到了,那有什么方法可以缓存呢,我们可以自定义一个HttpServletRequest,或者是想在请求参数中统一添加或删除参数也可以使用此类进行改造,然后通过过滤器继续向下流转。废话不多说上代码。

java 复制代码
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {

    
    private final Map<String, String[]> parameterMap;
    private final byte[] cachedBody;
    
    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
        super(request);
        this.parameterMap = request.getParameterMap();
        this.cachedBody = IoUtil.readBytes(request.getInputStream(), false);
    }

    @Override
    public String getParameter(String name) {
        String[] values = this.parameterMap.get(name);
        return (values != null && values.length > 0) ? values[0] : null;
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return Collections.unmodifiableMap(this.parameterMap);
    }

    @Override
    public String[] getParameterValues(String name) {
        return this.parameterMap.get(name);
    }
    
    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new CachedBodyServletInputStream(this.cachedBody);
    }
    
    @Override
    public BufferedReader getReader() throws IOException {
        ByteArrayInputStream bais = new ByteArrayInputStream(this.cachedBody);
        return new BufferedReader(new InputStreamReader(bais));
    }
    
    public byte[] getCachedBody() {
        return this.cachedBody;
    }
    
    private static class CachedBodyServletInputStream extends ServletInputStream {
        
        private final ByteArrayInputStream buffer;
        
        public CachedBodyServletInputStream(byte[] contents) {
            this.buffer = new ByteArrayInputStream(contents);
        }
        
        @Override
        public int read() throws IOException {
            return buffer.read();
        }
        
        @Override
        public boolean isFinished() {
            return buffer.available() == 0;
        }
        
        @Override
        public boolean isReady() {
            return true;
        }
        
        @Override
        public void setReadListener(ReadListener listener) {
            throw new UnsupportedOperationException();
        }
    }
}

这里也要提到一个小知识点,当浏览器或其他客户端向服务器发送HTTP请求时,请求可以包含请求头和请求体。对于GET请求,通常没有请求体,而对于POST请求,请求体中可能包含了表单数据、JSON对象或其他类型的数据。request.getInputStream() 方法允许开发者读取这些数据。

相关推荐
zww894911121 分钟前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水1 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero2 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-2 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491113 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设4 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳4 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥5 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e5 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
devpotato5 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis