(1)新增一个HttpServletRequestWrapper类
public class RepeatedlyReadRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
/**
* @param request
*/
public RepeatedlyReadRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public BufferedReader getReader() {
ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body);
return new BufferedReader(new InputStreamReader(byteArrayIns));
}
@Override
public ServletInputStream getInputStream() {
try {
body = StreamUtils.copyToByteArray(getRequest().getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body);
ServletInputStream servletIns = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return byteArrayIns.read();
}
};
return servletIns;
}
}
(2)添加一个 Filter对请求的request进到 RepeatedlyReadRequestWrapper处理
@Component
@WebFilter("/*")
public class ReadBodyHttpServletFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
if (StrUtil.isNotBlank(httpServletRequest.getContentType()) && !httpServletRequest.getContentType().contains(ContentType.MULTIPART.getValue())) {
RepeatedlyReadRequestWrapper requestWrapper = new RepeatedlyReadRequestWrapper(httpServletRequest);
filterChain.doFilter(requestWrapper, httpServletResponse);
} else {
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
@Override
public void destroy() {
}
}
(3)最后在推送飞书的 AppenderBase获取到 request拼接 curl
private String getCurlCommand(HttpServletRequest request) {
String requestBody = null;
StringBuilder stringBuilder = new StringBuilder();
String line;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
requestBody = stringBuilder.toString();
} catch (Exception e) {
return null;
}
List<String> paramsList = new ArrayList<>();
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
String k = entry.getKey();
paramsList.add(k + "=" + request.getParameterMap().get(k)[0]);
}
String method = request.getMethod() + " ";
String params = String.join("&", paramsList);
String url = request.getRequestURL().toString();
String headers = Collections.list(request.getHeaderNames())
.stream()
.map(name -> "-H '" + name + ": " + request.getHeader(name) + "'" + "\n")
.reduce("", (acc, item) -> acc + " " + item);
String dataRaw = "--data-raw $'" + requestBody + "'";
if (StrUtil.isNotBlank(params)) {
url = url + "?" + params;
}
String curlCommand = "curl -X " + method + "'" + url + "'" + "\n" + headers;
if (StrUtil.isNotBlank(requestBody)) {
curlCommand = curlCommand + dataRaw;
}
return curlCommand;
}