在此我们通过过滤器来完成本功能
@WebFilter(filterName = "RequestBodyFilter", urlPatterns = "/**")
public class RequestBodyFilter implements Filter {
public static final String LOGTHREAD_ID="logthreadId";
private static final Logger LOGGER = LoggerFactory.getLogger(RequestBodyFilter.class);
public static final String URI_ENCODING = NsConfiguration.getInstance()
.getConf(NsConfiguration.KEY_URI_ENCODING);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//日志打印唯一标识
MDC.put(LOGTHREAD_ID,java.util.UUID.randomUUID().toString().replace("-",""));
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding("UTF-8");
//获取body数据
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while((line = reader.readLine())!=null){
sb.append(line);
}
String postContent = sb.toString();
//如果body中存在数据放入HttpServletRequest
if (!RequestBodyFilter.isEmpty(postContent) ){
request = new ParameterRequestWrapper(request);
LOGGER.debug(postContent);
String[] params = postContent.split("&");
for (String param : params) {
String[] pkv = param.split("=");
String data = URLDecoder.decode(pkv[1], URI_ENCODING);
((ParameterRequestWrapper)request).addParameter(pkv[0],data);
}
}
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
}
public static boolean isEmpty(Object str) {
return str == null || "".equals(str) || "{}".equals(str);
}