这篇文章主要介绍了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 {
@Beanpublic 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 = “, “;
@Overridepublic int getOrder() { return order;}@Overrideprotected 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();}
}`
检查注解
@ResponseBody
@RequestBody
检查实体
接收实体类,set、get方法是否正确
检查Content-Type
是否是application/json