当前位置: 首页 > 知识库问答 >
问题:

HttpServletRequestWrapper,setReadListener/isFinished/IsReady的示例实现?

申宜
2023-03-14

我正在尝试修改HttpServletRequestWrapper(请参见如何多次读取InputStream)以使其能够在过滤器中使用HTTP Post主体后读取它。现在我遇到了如何实现ServletInputStream的挑战。从规范3.1开始,有一些新的方法必须实现。

  • 已完成
  • 已就绪
  • SetReadListener

共有1个答案

郭琨
2023-03-14

示例实现:

import com.google.common.primitives.Bytes;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

public class AuthenticationRequestWrapper extends HttpServletRequestWrapper {

    // tag::variables[]
    private byte[] requestBody = new byte[0];
    private boolean bufferFilled = false;
    // end::variables[]

    /**
     - Constructs a request object wrapping the given request.
     *
     - @param request The request to wrap
     - @throws IllegalArgumentException if the request is null
     */
    public AuthenticationRequestWrapper(HttpServletRequest request) {
        super(request);
    }


    // tag::getRequestBody[]
    public byte[] getRequestBody() throws IOException {
        if (bufferFilled) {
            return Arrays.copyOf(requestBody, requestBody.length);
        }

        InputStream inputStream = super.getInputStream();

        byte[] buffer = new byte[102400]; // 100kb buffer

        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            requestBody = Bytes.concat(this.requestBody, Arrays.copyOfRange(buffer, 0, bytesRead)); // <1>
        }

        bufferFilled = true;

        return requestBody;
    }
    // end::getRequestBody[]

    // tag::getInputStream[]
    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new CustomServletInputStream(getRequestBody()); // <1>
    }
    // end::getInputStream[]

    private static class CustomServletInputStream extends ServletInputStream {

        private ByteArrayInputStream buffer;

        public CustomServletInputStream(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 RuntimeException("Not implemented");
        }
    }
}
 类似资料:
  • 问题内容: 我需要开发一个JCA适配器,正在寻找一些参考。我在亚马逊上搜索,发现只有2本JCA书籍,其中一本的评论很差。所以我想那只剩下一本书可供我参考。 因此,我想知道是否有任何JCA适配器示例实现将对我的开发有所帮助。我在Google上进行了搜索,但仅找到了一些非常简单的示例。提前致谢。 问题答案: 当我开发适配器时,我使用了JBoss的示例。我相信这是链接: http://docs.jbos

  • 本文向大家介绍pyqt5 QlistView列表显示的实现示例,包括了pyqt5 QlistView列表显示的实现示例的使用技巧和注意事项,需要的朋友参考一下 1、简介 QlistView类用于展示数据,它的子类是QListWIdget。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据 QListWidget是一个升级版本的QListView,它已经建立了一个数据储

  • 本文向大家介绍angular5 httpclient的示例实战,包括了angular5 httpclient的示例实战的使用技巧和注意事项,需要的朋友参考一下 从angular 4.3.0 以后的版本开始使用httpclient,替换了之前的http,引用的包路径已经变为了angular/common/http了 一个基础的 httpclient 样例 以上就是本文的全部内容,希望对大家的学习有所

  • 本文向大家介绍jquery实现的分页显示功能示例,包括了jquery实现的分页显示功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery实现的分页显示功能。分享给大家供大家参考,具体如下: 我们在显示文章列表的时候,通常需要分页显示。 一种方式是通过SQL查询的limit进行分页,即只查询该页面的数据。 另外一种方式是查询出所有的数据,传递给前段,然后用jquery控制只显示

  • 本文向大家介绍Linux tac命令的实现示例,包括了Linux tac命令的实现示例的使用技巧和注意事项,需要的朋友参考一下 1.命令简介 tac(cat 的反序)命令以行为单位反序输出文件内容,即第一行最后显示,最后一行先显示。输出内容和 cat 命令相反。 2.命令格式 如果没有文件或文件是 -,读取标准输入。 3.选项说明 长选项的强制性参数对于短选项也是强制的。 4.常用示例 给定文件

  • 本文向大家介绍Vue指令实现OutClick的示例,包括了Vue指令实现OutClick的示例的使用技巧和注意事项,需要的朋友参考一下 原始实现 下面是两种常见的模态框的实现方式 方案一:默认 click 都是放在冒泡阶段,只要在内容区域上添加 click 的阻止冒泡即可 方案二:通过代码判断点击触发的 DOM 是否在内容区域内 指令实现 上面的代码可以解决全屏的模态框点击外部区域关闭。但是还有一