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} }}
阅读全文
0 0
- springboot 使用过滤器获取response内容保存接口访问日志
- 在过滤器Filter中获取Response中的内容
- 项目案例: Springboot中使用过滤器映射访问路径
- PHP 如果获取接口的值和response headers内容
- SpringBoot过滤器的使用
- Springboot-访问日志统一处理
- Springboot项目使用aop切面保存详细日志到ELK日志平台
- 使用Twitter接口获取twitter内容
- SpringBoot中logback日志保存到mongoDB
- 使用外部表访问警告日志内容(转)
- SpringBoot实战 之 接口日志篇
- springboot之过滤器,监听器的使用
- js获取后台response的内容。
- SpringBoot日志logback的使用
- nginx访问日志没有内容
- 获取网页内容,并保存
- 使用HttpClient请求另一个项目接口获取内容
- 使用HttpClient请求另一个项目接口获取内容
- 使用str.setCharAt(位置,'字符'),修改指定索引处的字符
- 数据库常见死锁原因及处理
- 线性合并的应用 九度OJ 1004
- C++成员初始化列表详解
- 局部变量和成员变量详细解析
- springboot 使用过滤器获取response内容保存接口访问日志
- hdu1863 畅通工程
- OI颓废史启动仪式
- android weex 环境安装笔记windows环境
- 正则表达式
- Never Wait for Weights(带权并查集)
- iOS 内购 1
- CentOS安装intellijIDEA步骤
- P1002 过河卒