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
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決HttpServletRequest 流數據不可重復讀的操作
- SpringBoot 請求參數忽略大小寫的實例
- SpringBoot2之PUT請求接收不瞭參數的解決方案
- springmvc 獲取@Requestbody轉換的異常處理方式
- Springboot如何利用攔截器攔截請求信息收集到日志詳解