springboot 使用过滤器获取response内容保存接口访问日志

来源:互联网 发布:电脑编程软件 编辑:程序博客网 时间:2024/05/16 04:54

参考原文:http://www.jianshu.com/p/05c8be17c80a    http://blog.csdn.net/zhongzh86/article/details/45721369

一、创建过滤器

1. 在spring boot的启动入口出添加注解 @ServletComponentScan

@SpringBootApplication@ServletComponentScanpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Applicatioin.class, args);    }}
2.新建过滤器AccessLogFilter.java


@WebFilter(filterName = "accessLog", urlPatterns = "/api/*")public class AccessLogFilter implements Filter {@AutowiredAccessLogMapper accessLogMapper; public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {long startTime = System.currentTimeMillis();ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);HttpServletRequest req = (HttpServletRequest) request;chain.doFilter(request, wrapper);long endTime = System.currentTimeMillis();Gson gson = new Gson();// 获取response返回的内容并重新写入responseString result = wrapper.getResponseData(response.getCharacterEncoding());response.getOutputStream().write(result.getBytes());               String uri = req.getRequestURI();AccessLog log =  new AccessLog();log.setMethod(req.getMethod());log.setUrl(uri);log.setParameters(gson.toJson(req.getParameterMap()));log.setResponseCode(String.valueOf(wrapper.getStatus()));log.setResult(result);log.setCreateDatetime(new Date());log.setTimeConsuming((int)(endTime - startTime));accessLogMapper.insertSelective(log);}public void init(FilterConfig fConfig) throws ServletException {}}
这个过滤器使用了注解@WebFilter(filterName = "accessLog", urlPatterns = "/api/*") 进行配置,指定了url进入规则,只有以/api/开头的url才能进入到此过滤器中。在doFilter方法中使用了自定义的ResponseWrapper对response进行封装。Controller接口走完之后获取到接口返回的数据并再次封装到response。

3. ResponseWrapper.java 类

import java.io.ByteArrayOutputStream;import java.io.CharArrayWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import javax.servlet.ServletOutputStream;import javax.servlet.WriteListener;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class ResponseWrapper extends HttpServletResponseWrapper {    private ByteArrayOutputStream buffer = null;    private ServletOutputStream out = null;    private PrintWriter writer = null;        public ResponseWrapper(HttpServletResponse response) throws IOException{super(response);                buffer = new ByteArrayOutputStream();        out = new WapperedOutputStream(buffer);        writer = new PrintWriter(new OutputStreamWriter(buffer, "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();           try {            return new String(bytes, "UTF-8");        } catch (UnsupportedEncodingException e) {            return "";        }     }//内部类,对ServletOutputStream进行包装,指定输出流的输出端    private class WapperedOutputStream extends ServletOutputStream {        private ByteArrayOutputStream bos = null;        public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {            bos = stream;        }        //将指定字节写入输出流bos        @Override        public void write(int b) throws IOException {            bos.write(b);        }@Overridepublic boolean isReady() {// TODO Auto-generated method stubreturn false;}@Overridepublic void setWriteListener(WriteListener listener) {// TODO Auto-generated method stub}    }}


原创粉丝点击