1.首先写一个获取返回值的类
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* @Author Jack
* @Date 2019/2/11 9:58
* @Version 1.0.0
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer;
private ServletOutputStream out;
private PrintWriter writer;
public ResponseWrapper(HttpServletResponse response) throws IOException{
super(response);
buffer = new ByteArrayOutputStream();
out = new WapperedOutputStream(buffer);
writer = new PrintWriter(new OutputStreamWriter(buffer, StandardCharsets.UTF_8));
}
//重载父类获取outputstream的方法
@Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
@Override
public PrintWriter getWriter() throws IOException {
return writer;
}
@Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
if (writer != null) {
writer.flush();
}
}
@Override
public void reset() {
buffer.reset();
}
public String getResponseData(String charset) throws IOException {
flushBuffer();//将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据
byte[] bytes = buffer.toByteArray();
return new String(bytes, charset);
}
//内部类,对ServletOutputStream进行包装,指定输出流的输出端
private class WapperedOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos;
public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
bos = stream;
}
//将指定字节写入输出流bos
@Override
public void write(int b) throws IOException {
bos.write(b);
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
// TODO Auto-generated method stub
}
}
}
2.然后写一个过滤器类
import cn.scaiglobal.attendance.util.FastJsonUtils;
import cn.scaiglobal.attendance.util.ResponseWrapper;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @Author Jack
* @Date 2019/2/2 10:04
* @Version 1.0.0
*/
@WebFilter(filterName = "myFilter", urlPatterns = "/**")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器处理");
ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) servletResponse);
//里面的是wrapper
filterChain.doFilter(servletRequest, wrapper);
String result = wrapper.getResponseData(servletResponse.getCharacterEncoding());
System.out.println("===返回值====" + result);
//对result进行一些处理(比如先把json字符串转换为map,然后进行修改,再转换为json字符串)
servletResponse.getOutputStream().write(result.getBytes());
}
@Override
public void destroy() {
System.out.println("过滤器销毁");
}
}
此外,要使过滤器生效,在Spring Boot的启动类上面加上注解@ServletComponentScan(basePackages = {"xx.xxxx.xxx.filter"})
Comments | NOTHING