package com.common.filter;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.common.sign.BufferedHttpServletRequest;
|
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
import javax.servlet.FilterChain;
|
import javax.servlet.ServletException;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.nio.charset.StandardCharsets;
|
import java.util.Collections;
|
|
|
/**
|
* @author 廖振钦
|
* @date 2022-01-14
|
*/
|
public class RequestCachingFilter extends OncePerRequestFilter {
|
private static Logger LOGGER = LoggerFactory.getLogger(RequestCachingFilter.class);
|
|
@Override
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
boolean isFirstRequest = !isAsyncDispatch(request);
|
HttpServletRequest requestToUse = request;
|
if (isFirstRequest && !(request instanceof BufferedHttpServletRequest)) {
|
requestToUse = new BufferedHttpServletRequest(request, 1024);
|
}
|
try {
|
filterChain.doFilter(requestToUse, response);
|
} catch (Exception e) {
|
LOGGER.error("RequestCachingFilter>>>>>>>>>", e);
|
} finally {
|
// this.printRequest(requestToUse); TODO
|
if (requestToUse instanceof BufferedHttpServletRequest) {
|
((BufferedHttpServletRequest) requestToUse).release();
|
}
|
}
|
}
|
|
private void printRequest(HttpServletRequest request) {
|
String body = StringUtils.EMPTY;
|
try {
|
if (request instanceof BufferedHttpServletRequest) {
|
body = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
|
}
|
} catch (IOException e) {
|
LOGGER.error("printRequest 获取body异常...", e);
|
}
|
|
JSONObject requestJ = new JSONObject();
|
JSONObject headers = new JSONObject();
|
Collections.list(request.getHeaderNames())
|
.stream()
|
.forEach(name -> headers.put(name, request.getHeader(name)));
|
requestJ.put("headers", headers);
|
requestJ.put("parameters", request.getParameterMap());
|
requestJ.put("body", body);
|
requestJ.put("remote-user", request.getRemoteUser());
|
requestJ.put("remote-addr", request.getRemoteAddr());
|
requestJ.put("remote-host", request.getRemoteHost());
|
requestJ.put("remote-port", request.getRemotePort());
|
requestJ.put("uri", request.getRequestURI());
|
requestJ.put("url", request.getRequestURL());
|
requestJ.put("servlet-path", request.getServletPath());
|
requestJ.put("method", request.getMethod());
|
requestJ.put("query", request.getQueryString());
|
requestJ.put("path-info", request.getPathInfo());
|
requestJ.put("context-path", request.getContextPath());
|
|
// LOGGER.info("Request-Info: " + JSON.toJSONString(requestJ, SerializerFeature.PrettyFormat));
|
}
|
|
}
|