67,549
社区成员




@Slf4j
@Order(Ordered.LOWEST_PRECEDENCE - 1)// 定义最后一个执行
@WebFilter(urlPatterns = "/*")
public class ResponseWrapperFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("..doFilterInternal..1");
String uri = request.getRequestURI();
boolean pass = "/".equals(uri);
if (!pass) {
System.out.println("..doFilterInternal..2");
ResponseWrapper wrapper = new ResponseWrapper(response);
try {
filterChain.doFilter(request, wrapper);
System.out.println("..doFilterInternal..3");
String responseStr = new String(wrapper.toByteArray(), response.getCharacterEncoding());
String new_response = DataUtils.parseResponse(request, JSON.parseObject(responseStr));
response.setContentLength(new_response.getBytes("utf-8").length);
response.setContentType("application/json;charset=utf-8");
response.getOutputStream().write(new_response.getBytes("utf-8"));
System.out.println("..doFilterInternal..4");
} catch (Exception e) {
e.printStackTrace();
}
} else {
// 直接通过。
ResponseWrapper wrapper = new ResponseWrapper(response);
filterChain.doFilter(request, wrapper);
}
}
}
ResponseWrapper wrapper = new ResponseWrapper(response);
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream output;
private ServletOutputStream filterOutput;
public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
}
/**
* 参考:
* https://blog.csdn.net/qq_27886997/article/details/76560235
* https://blog.csdn.net/more_try/article/details/81175699
*
* @return
* @throws IOException
*/
@Override
public ServletOutputStream getOutputStream() throws IOException {
if (filterOutput == null) {
filterOutput = new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
output.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
};
}
return filterOutput;
}
public byte[] toByteArray() {
return output.toByteArray();
}
}