我试图调整一个HttpServletRequestWrapper(见
How to read InputStream multiple times),以便在过滤器中使用HTTP Post主体后可以读取HTTP Post主体.现在我遇到了一个如何实现ServletInputStream的挑战.从规范3.1开始,必须实施新的方法.
>已完成
> isReady
> setReadListener
解决方法
示例实现:
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,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"); } } }
原文地址:https://www.jb51.cc/java/124392.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。