码迷,mamicode.com
首页 > 其他好文 > 详细

ServletResponse获取响应体 日志记录出参

时间:2018-06-15 12:49:28      阅读:614      评论:0      收藏:0      [点我收藏+]

标签:etl   config   private   res   AC   ati   pat   connector   alibaba   

有个需要日志记录http请求和响应的需求,通过一个logFilter来实现

 

一、入参打印

 JSON.toJSONString(servletRequest.getParameterMap()));

  

二、出参打印

ServletResponse中将输出流,直接获取流并不能获取流中的数据,只可以改写响应流,替换响应内容;
所以需要重写ServletResponse来保存传到输出流的内容;

com.github.isrsal.logging.ResponseWrapper 则实现了这个需求,将输出流的内容保存在了字节数组缓冲区;

需要引入的依赖:
<dependency>
            <groupId>com.github.isrsal</groupId>
            <artifactId>spring-mvc-logger</artifactId>
            <version>0.2</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
</dependency>

 

获取出参的方法:

ResponseWrapper responseWrapper = new ResponseWrapper(Thread.currentThread().getId(), (HttpServletResponse) servletResponse);
        filterChain.doFilter(servletRequest, responseWrapper);
String str = new String(responseWrapper.toByteArray(), responseWrapper.getCharacterEncoding());

  

三、完整的出入参打印

 

// https://www.cnblogs.com/chenhao0302/p/9186346.html

import com.alibaba.fastjson.JSON; import com.github.isrsal.logging.ResponseWrapper; import org.apache.catalina.connector.ResponseFacade; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.logging.log4j.ThreadContext; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @Author: 陈浩 * @Date: 2018-06-14 */ @Component @WebFilter(filterName = "logFilter", urlPatterns = "/*") public class LogFilter implements Filter { private static final Log log = LogFactory.getLog(LogFilter.class); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ThreadContext.put("TId", UUID.randomUUID().toString()); ResponseWrapper responseWrapper = new ResponseWrapper(Thread.currentThread().getId(), (HttpServletResponse) servletResponse); filterChain.doFilter(servletRequest, responseWrapper); Map params; // 记录入参 params = servletRequest.getParameterMap(); if (null != params) { log.info("入参:" + JSON.toJSONString(params)); } // 记录出参 String outParam = new String(); // 记录出参响应头 params = new HashMap(); // 如果响应头存在respCode则打印 try { params.put("respCode", ((ResponseFacade) servletResponse).getHeader("respCode")); params.put("respMsg", (URLDecoder.decode(((ResponseFacade) servletResponse).getHeader("respMsg"), "UTF-8"))); outParam = JSON.toJSONString(params); } catch (Exception e) { } // 记录出参响应体 outParam = outParam + new String(responseWrapper.toByteArray(), responseWrapper.getCharacterEncoding()); log.info("出参:" + outParam); ThreadContext.clearAll(); } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } }

  

ServletResponse获取响应体 日志记录出参

标签:etl   config   private   res   AC   ati   pat   connector   alibaba   

原文地址:https://www.cnblogs.com/chenhao0302/p/9186346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!