这里用这种包,其实在一些情况下,没有必要,如果要对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
*/
@Slf4j
public 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);
}
}
@Override
public ServletInputStream getInputStream() {
return new SignWrapperInputStream(body);
}
@Override
public 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);
}
@Override
public int read() {
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");
}
}
}
@Slf4j
public class HttpResponseWrapper extends HttpServletResponseWrapper {
private final WrapperServletOutputStream wrapperServletOutputStream = new WrapperServletOutputStream();
HttpResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public ServletOutputStream getOutputStream() {
return wrapperServletOutputStream;
}
@Override
public 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();
@Override
public boolean isReady() {
return true;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) {
out.write(b);
}
@Override
public void write(byte[] b) throws IOException {
out.write(b);
}
@Override
public void write(byte[] b, int off, int len) {
out.write(b, off, len);
}
}
}