package com.zbkj.common.wrapper; import org.apache.commons.io.IOUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * @ClassName ContentCachingRequestWrapper * @Description 用于重复读取requestBody * @Author HZW * @Date 2023/2/22 18:01 * @Version 1.0 */ public class ContentCachingRequestWrapper extends HttpServletRequestWrapper { private byte[] body; private BufferedReader reader; private ServletInputStream inputStream; /** * Constructs a request object wrapping the given request. * * @param request the {@link HttpServletRequest} to be wrapped. * @throws IllegalArgumentException if the request is null */ public ContentCachingRequestWrapper(HttpServletRequest request) throws IOException { super(request); loadBody(request); } private void loadBody(HttpServletRequest request) throws IOException { body = IOUtils.toByteArray(request.getInputStream()); inputStream = new RequestCachingInputStream(body); } public byte[] getBody() { return body; } @Override public ServletInputStream getInputStream() throws IOException { if (inputStream != null) { return inputStream; } return super.getInputStream(); } @Override public BufferedReader getReader() throws IOException { if (reader == null) { reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding())); } return reader; } private static class RequestCachingInputStream extends ServletInputStream { private final ByteArrayInputStream inputStream; public RequestCachingInputStream(byte[] bytes) { inputStream = new ByteArrayInputStream(bytes); } @Override public int read() throws IOException { return inputStream.read(); } @Override public boolean isFinished() { return inputStream.available() == 0; } @Override public boolean isReady() { return true; } @Override public void setReadListener(ReadListener readlistener) { } } }