From f950f985367f819ab6a75284846d9f1166302288 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Mon, 6 Oct 2025 17:11:03 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/BKI-3215 Moved member code logging logic to MemberCodeHttpLoggingFilter; Added CachedServletInputStream; Updated CachedHttpRequestWrapper --- .../rest/filters/HttpLoggingFilter.java | 78 ++----------------- .../filters/MemberCodeHttpLoggingFilter.java | 55 +++++++++++++ .../wrappers/CachedHttpRequestWrapper.java | 28 +------ .../wrappers/CachedServletInputStream.java | 33 ++++++++ 4 files changed, 99 insertions(+), 95 deletions(-) create mode 100644 src/main/java/ru/nbch/credit_tracker/config/rest/filters/MemberCodeHttpLoggingFilter.java create mode 100644 src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedServletInputStream.java diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java index 7b33f68..27f3fa2 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java @@ -13,18 +13,11 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; -import ru.nbch.credit_tracker.config.rest.wrappers.CachedHttpRequestWrapper; -import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest; -import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest; -import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.isNotBlank; - @Component @Slf4j @Order(0) @@ -33,12 +26,6 @@ public class HttpLoggingFilter extends OncePerRequestFilter { private static final Set SENSITIVE_HEADERS = Set.of("authorization", "cookie", "set-cookie"); private static final int MAX_BODY = 10 * 1024; - private final IXmlProcessor xmlProcessor; - - public HttpLoggingFilter(IXmlProcessor xmlProcessor) { - this.xmlProcessor = xmlProcessor; - } - @Override protected boolean shouldNotFilter(HttpServletRequest request) { String path = request.getRequestURI(); @@ -52,7 +39,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter { long startNs = System.nanoTime(); - HttpServletRequestWrapper req = wrapRequest(request); + ContentCachingRequestWrapper req = wrapRequest(request); ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response); String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id")) @@ -60,15 +47,14 @@ public class HttpLoggingFilter extends OncePerRequestFilter { .orElse(UUID.randomUUID().toString()); resp.setHeader("X-Correlation-Id", correlationId); - String memberCode = parseMemberCode(req); - logIncomingRequest(req, correlationId, memberCode); + logIncomingRequest(req, correlationId); try { chain.doFilter(req, resp); } finally { long tookMs = (System.nanoTime() - startNs) / 1_000_000; - Map reqParams = paramsMap(req, memberCode); + Map reqParams = paramsMap(req); Map reqHeaders = headersMap(req); Map respHeaders = headersMap(resp); @@ -92,46 +78,8 @@ public class HttpLoggingFilter extends OncePerRequestFilter { } } - private String parseMemberCode(HttpServletRequestWrapper req) { - String memberCode = null; - if (!(req instanceof CachedHttpRequestWrapper)) { - return null; - } - - String body = ((CachedHttpRequestWrapper) req).getBody(); - if (isBlank(body)) { - return null; - } - switch (req.getRequestURI()) { - case "/api/v1/signal/active_packages": - try { - MonitoringActivePackagesRequest activePackagesRequest = xmlProcessor.read(body, MonitoringActivePackagesRequest.class); - if (activePackagesRequest != null && isNotBlank(activePackagesRequest.getUserId())) { - memberCode = activePackagesRequest.getUserId().substring(0, 6); - } - } catch (Exception e) { - memberCode = null; - } - break; - case "/api/v1/signal/all_packages": - try { - MonitoringAllPackagesRequest allPackagesRequest = xmlProcessor.read(body, MonitoringAllPackagesRequest.class); - if (allPackagesRequest != null && isNotBlank(allPackagesRequest.getUserId())) { - memberCode = allPackagesRequest.getUserId().substring(0, 6); - } - } catch (Exception e) { - memberCode = null; - } - break; - default: - break; - } - return memberCode; - } - - - private void logIncomingRequest(HttpServletRequestWrapper req, String correlationId, String memberCode) { - Map reqParams = paramsMap(req, memberCode); + private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) { + Map reqParams = paramsMap(req); Map reqHeaders = headersMap(req); mask(reqHeaders); @@ -145,13 +93,8 @@ public class HttpLoggingFilter extends OncePerRequestFilter { ); } - private static HttpServletRequestWrapper wrapRequest(HttpServletRequest request) throws IOException { - return switch (request.getRequestURI()) { - case "/api/v1/signal/active_packages", "/api/v1/signal/all_packages" -> - new CachedHttpRequestWrapper(request); - default -> - (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY); - }; + private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) throws IOException { + return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY); } @@ -160,7 +103,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter { .collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new)); } - private static Map paramsMap(HttpServletRequestWrapper req, String memberCode) { + private static Map paramsMap(HttpServletRequestWrapper req) { Map paramsMap = new LinkedHashMap<>(); req.getParameterMap().forEach((k, v) -> { String params = String.join(", ", v); @@ -175,11 +118,6 @@ public class HttpLoggingFilter extends OncePerRequestFilter { } catch (Exception e) { // ignore } - - if (memberCode != null) { - paramsMap.put("memberCode", memberCode); - } - return paramsMap; } diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/MemberCodeHttpLoggingFilter.java b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/MemberCodeHttpLoggingFilter.java new file mode 100644 index 0000000..8e0e4ff --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/MemberCodeHttpLoggingFilter.java @@ -0,0 +1,55 @@ +package ru.nbch.credit_tracker.config.rest.filters; + + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import ru.nbch.credit_tracker.config.rest.wrappers.CachedHttpRequestWrapper; + +import java.io.IOException; + +@Component +@Slf4j +@Order(1) +public class MemberCodeHttpLoggingFilter extends OncePerRequestFilter { + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String path = request.getRequestURI(); + return !(path.startsWith("/api/v1/signal/all_packages") || path.startsWith("/api/v1/signal/active_packages")); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + CachedHttpRequestWrapper req = wrapRequest(request); + String body = IOUtils.toString(req.getBody(), req.getCharacterEncoding()); + if (StringUtils.isNotBlank(body)) { + try { + int startIndex = body.indexOf("") + 8; + int endIndex = body.indexOf(""); + String userId = body.substring(startIndex, endIndex); + log.info( + "HTTP (REQUEST) {} {} | memberCode={}", + req.getMethod(), + req.getRequestURI(), + userId.substring(0, 6) + ); + } catch (Exception e) { + // ignore + } + } + + filterChain.doFilter(req, response); + } + + private static CachedHttpRequestWrapper wrapRequest(HttpServletRequest request) throws IOException { + return new CachedHttpRequestWrapper(request); + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java index bf2517a..84d2231 100644 --- a/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java @@ -1,47 +1,25 @@ package ru.nbch.credit_tracker.config.rest.wrappers; -import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; import lombok.Getter; -import org.apache.commons.io.IOUtils; -import java.io.ByteArrayInputStream; import java.io.IOException; @Getter public class CachedHttpRequestWrapper extends HttpServletRequestWrapper { - private final String body; + private final byte[] body; public CachedHttpRequestWrapper(HttpServletRequest request) throws IOException { super(request); - body = IOUtils.toString(request.getReader()); + this.body = request.getInputStream().readAllBytes(); } @Override public ServletInputStream getInputStream() { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(getBody().getBytes()); - return new ServletInputStream() { - public int read() { - return byteArrayInputStream.read(); - } - - @Override - public boolean isFinished() { - return false; - } - - @Override - public boolean isReady() { - return false; - } - - @Override - public void setReadListener(ReadListener listener) { - } - }; + return new CachedServletInputStream(body); } } diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedServletInputStream.java b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedServletInputStream.java new file mode 100644 index 0000000..04f718b --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedServletInputStream.java @@ -0,0 +1,33 @@ +package ru.nbch.credit_tracker.config.rest.wrappers; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; + +import java.io.ByteArrayInputStream; + +public class CachedServletInputStream extends ServletInputStream { + + private final ByteArrayInputStream byteArray; + + public CachedServletInputStream(byte[] data) { + this.byteArray = new ByteArrayInputStream(data); + } + + public int read() { + return byteArray.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener listener) { + } +}