import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* @date 2021-05-05
*/
public class HttpResponseWrapper extends HttpServletResponseWrapper {
/**
* 我们的分支流
*/
private ByteArrayOutputStream output;
private ServletOutputStream filterOutput;
public HttpResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
}
/**
* 原理就是往response流中写入时,也往我们的ByteArrayOutputStream流中写入一份
*/
@Override
public ServletOutputStream getOutputStream() {
if (filterOutput == null) {
filterOutput = new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) throws IOException {
HttpResponseWrapper.super.getOutputStream().write(b);
output.write(b);
}
};
}
return filterOutput;
}
public byte[] toByteArray() {
return output.toByteArray();
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @date 2021-05-05
*/
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@WebFilter(urlPatterns = {"/*"}, filterName = "httpResponseWrapperFilter")
public class HttpResponseWrapperFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(HttpResponseWrapperFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if (needWrapper(request.getRequestURI(), request.getMethod())) {
HttpResponseWrapper wrapper = new HttpResponseWrapper(response);
try {
filterChain.doFilter(request, wrapper);
} catch (IOException | ServletException e) {
throw e;
}
try {
// 获取到返回结果
String respStr = new String(wrapper.toByteArray(), response.getCharacterEncoding());
// TODO
} catch (Throwable e) {
logger.error("录制时发生异常", e);
}
return;
} else {
// 不做任何操作
filterChain.doFilter(request, response);
}
}
private boolean needWrapper(String uri, String method) {
// TODO
return true;
}
}