我正在尝试修改HttpServletRequestWrapper(请参见如何多次读取InputStream)以使其能够在过滤器中使用HTTP Post主体后读取它。现在我遇到了如何实现ServletInputStream的挑战。从规范3.1开始,有一些新的方法必须实现。
示例实现:
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 是否在内容区域内 指令实现 上面的代码可以解决全屏的模态框点击外部区域关闭。但是还有一