SpringBoot打印POST请求原始入参body体方式

 

SpringBoot打印POST请求原始入参body体

1、首先定义过滤器配置

package com.choice.o2o.device.common.config; 
import com.choice.o2o.device.common.filter.LogFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 
@Configuration
public class FilterConfig {

  @Bean
  public FilterRegistrationBean registFilter() {
      FilterRegistrationBean registration = new FilterRegistrationBean();
      registration.setFilter(new LogFilter());
      registration.addUrlPatterns("/*");
      registration.setName("LogFilter");
      registration.setOrder(1);
      return registration;
  }
}

2、实现1中的过滤器

package com.choice.o2o.three.code.config.log; 
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import org.springframework.web.util.WebUtils; 
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;

@Slf4j
public class LogParamFilter extends OncePerRequestFilter implements Ordered {
  // put filter at the end of all other filters to make sure we are processing after all others
  private int order = Ordered.LOWEST_PRECEDENCE - 8;
  public static final String SPLIT_STRING_M = "=";
  public static final String SPLIT_STRING_DOT = ", ";

  @Override
  public int getOrder() {
      return order;
  }

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                  FilterChain filterChain) throws ServletException, IOException {
      ContentCachingRequestWrapper wrapperRequest = new ContentCachingRequestWrapper(request);
      ContentCachingResponseWrapper wrapperResponse = new ContentCachingResponseWrapper(response);
      String urlParams = getRequestParams(request);
      filterChain.doFilter(wrapperRequest, wrapperResponse);

      String requestBodyStr = getRequestBody(wrapperRequest);
      log.info("params[{}] | request body:{}", urlParams, requestBodyStr);

      String responseBodyStr = getResponseBody(wrapperResponse);
      log.info("response body:{}", responseBodyStr);
      wrapperResponse.copyBodyToResponse();
  }

  /**
   * 打印请求参数
   *
   * @param request
   */
  private String getRequestBody(ContentCachingRequestWrapper request) {
      ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
      if (wrapper != null) {
          byte[] buf = wrapper.getContentAsByteArray();
          if (buf.length > 0) {
              String payload;
              try {
                  payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
              } catch (UnsupportedEncodingException e) {
                  payload = "[unknown]";
              }
              return payload.replaceAll("\\n", "");
          }
      }
      return "";
  }

  /**
   * 打印返回参数
   *
   * @param response
   */
  private String getResponseBody(ContentCachingResponseWrapper response) {
      ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response,
              ContentCachingResponseWrapper.class);
      if (wrapper != null) {
          byte[] buf = wrapper.getContentAsByteArray();
          if (buf.length > 0) {
              String payload;
              try {
                  payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
              } catch (UnsupportedEncodingException e) {
                  payload = "[unknown]";
              }
              return payload;
          }
      }
      return "";
  }

  /**
   * 获取请求地址上的参数
   *
   * @param request
   * @return
   */
  public static String getRequestParams(HttpServletRequest request) {
      StringBuilder sb = new StringBuilder();
      Enumeration<String> enu = request.getParameterNames();
      //获取请求参数
      while (enu.hasMoreElements()) {
          String name = enu.nextElement();
          sb.append(name + SPLIT_STRING_M).append(request.getParameter(name));
          if (enu.hasMoreElements()) {
              sb.append(SPLIT_STRING_DOT);
          }
      }
      return sb.toString();
  }
}

 

Post接收不到body里的参数(对象参数)

检查注解

  • @ResponseBody
  • @RequestBody

检查实体

接收实体类,set、get方法是否正确

检查Content-Type

是否是application/json

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程宝库

java内存结构的组成:1、程序计数器即PC寄存器,程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。2、Java虚拟机栈与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同3、本地方法栈与虚拟 ...