zoukankan      html  css  js  c++  java
  • java日志入参出参打印 ServletResponse获取响应体

    有个需要日志记录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());
    

      

    三、完整的出入参打印

    import com.alibaba.fastjson.JSON;
    import com.github.isrsal.logging.RequestWrapper;
    import com.github.isrsal.logging.ResponseWrapper;
    import org.apache.catalina.connector.RequestFacade;
    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: chenhao
     * @Date: 2018-06-14
     */
    @Component
    @WebFilter(filterName = "logFilter", urlPatterns = "/*")
    public class LogFilter implements Filter {
    
        private static final Log log = LogFactory.getLog(LogFilter.class);
    
        private static final String ignoreUrlRegex = ".*((pay/)|(/index)|(/index/.*)|([.]((html)|(jsp)|(css)|(js)|(gif)|(png))))$";
    
        @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);
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            RequestWrapper requestWrapper = new RequestWrapper(Thread.currentThread().getId(), httpServletRequest);
    
            // 请求html页面、js不打印日志
            if (httpServletRequest.getRequestURI().matches(ignoreUrlRegex)) {
                ThreadContext.clearAll();
                filterChain.doFilter(servletRequest, responseWrapper);
                return;
            }
    
            Map params;
            // 记录入参
            log.info("请求的URL:" + httpServletRequest.getRequestURI());
    
            filterChain.doFilter(requestWrapper, responseWrapper);
    
            // 打印from格式的入参信息
            params = servletRequest.getParameterMap();
            if (null != params && params.size() != 0) {
                log.info("入参:" + JSON.toJSONString(params));
            } else {
                // 打印json格式的入参信息
                String charEncoding = requestWrapper.getCharacterEncoding() != null ? requestWrapper.getCharacterEncoding() : "UTF-8";
                log.info("入参" + new String(requestWrapper.toByteArray(), charEncoding));
            }
    
            // 记录出参
            String outParam = new String();
            // 记录出参响应头
            params = new HashMap();
            // 如果响应头存在errorCode则打印,除文件下载外均不存在
            try {
                params.put("errorCode", ((ResponseFacade) servletResponse).getHeader("errorCode"));
                params.put("errorMsg", (URLDecoder.decode(((ResponseFacade) servletResponse).getHeader("errorMsg"), "UTF-8")));
                outParam = JSON.toJSONString(params);
            } catch (Exception e) {
            }
    
            // 记录出参响应体
            if (params.size() < 2) {
                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() {
        }
    
    
    }
  • 相关阅读:
    signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
    关于pthread_cond_wait使用while循环判断的理解
    linux的sleep()和usleep()的使用和区别
    C中结构体的存储分配
    扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition
    线程属性的初始化以及销毁
    Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
    sqlyog 注册码
    Oracle 12C卸载图文教程
    Oracle12c Release1安装图解(详解)
  • 原文地址:https://www.cnblogs.com/chenhao0302/p/9186346.html
Copyright © 2011-2022 走看看