这里用这种包,其实在一些情况下,没有必要,如果要对response返回的数据进行重写的话,是没有问题的
import lombok.extern.slf4j.Slf4j;import org.springframework.util.StreamUtils;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;/*** @author shizi* @since 2020-12-21 18:24:33*/@Slf4jpublic class HttpRequestWrapper extends HttpServletRequestWrapper {private byte[] body;/*** Constructs a request object wrapping the given request.** @param request The request to wrap* @throws IllegalArgumentException if the request is null*/public HttpRequestWrapper(HttpServletRequest request) {super(request);try {body = StreamUtils.copyToByteArray(request.getInputStream());} catch (IOException e) {log.error("wrapper request io fail:{}", request.getRequestURI(), e);}}@Overridepublic ServletInputStream getInputStream() {return new SignWrapperInputStream(body);}@Overridepublic BufferedReader getReader() {return new BufferedReader(new InputStreamReader(getInputStream()));}public byte[] getBody() {return body;}public void setBody(byte[] body) {this.body = body;}private static class SignWrapperInputStream extends ServletInputStream {private ByteArrayInputStream buffer;SignWrapperInputStream(byte[] body) {body = (body == null) ? new byte[0] : body;this.buffer = new ByteArrayInputStream(body);}@Overridepublic int read() {return buffer.read();}@Overridepublic boolean isFinished() {return buffer.available() == 0;}@Overridepublic boolean isReady() {return true;}@Overridepublic void setReadListener(ReadListener listener) {throw new RuntimeException("Not implemented");}}}
@Slf4jpublic class HttpResponseWrapper extends HttpServletResponseWrapper {private final WrapperServletOutputStream wrapperServletOutputStream = new WrapperServletOutputStream();HttpResponseWrapper(HttpServletResponse response) {super(response);}@Overridepublic ServletOutputStream getOutputStream() {return wrapperServletOutputStream;}@Overridepublic PrintWriter getWriter() {return new PrintWriter(wrapperServletOutputStream);}public byte[] getBodyBytes() {return wrapperServletOutputStream.out.toByteArray();}public String getBodyString() {try {return wrapperServletOutputStream.out.toString("UTF-8");} catch (UnsupportedEncodingException e) {return "[UNSUPPORTED ENCODING]";}}public void setBody(String body) throws IOException {wrapperServletOutputStream.out.write(body.getBytes(StandardCharsets.UTF_8));}/*** 将 body内容 重新赋值到 response 中* 由于stream 只读一次 需要重写到response中*/public void copyToResponse() {try {getResponse().getOutputStream().write(getBodyBytes());} catch (IOException e) {log.error("copy to response fail", e);}}private static class WrapperServletOutputStream extends ServletOutputStream {private ByteArrayOutputStream out = new ByteArrayOutputStream();@Overridepublic boolean isReady() {return true;}@Overridepublic void setWriteListener(WriteListener writeListener) {}@Overridepublic void write(int b) {out.write(b);}@Overridepublic void write(byte[] b) throws IOException {out.write(b);}@Overridepublic void write(byte[] b, int off, int len) {out.write(b, off, len);}}}
