From e5f350630f00e56b56d2a2e0d9c67e1ad01b1809 Mon Sep 17 00:00:00 2001 From: geonhos Date: Mon, 20 May 2024 08:53:14 +0900 Subject: [PATCH] =?UTF-8?q?admin:=20=EB=A1=9C=EA=B9=85=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=ED=95=84=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../poc/admin/fitler/LoggingFilter.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java new file mode 100644 index 0000000..5bf0224 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java @@ -0,0 +1,80 @@ +package com.bpgroup.poc.admin.fitler; + +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.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.stream.Stream; + +@Slf4j +@Order(Ordered.HIGHEST_PRECEDENCE) +@Component +public class LoggingFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + customDoFilter(new ContentCachingRequestWrapper(request), new ContentCachingResponseWrapper(response), filterChain); + } + + protected void customDoFilter(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response, FilterChain filterChain) throws ServletException, IOException { + String sessionId = request.getSession().getId(); + + try { + loggingRequest(request, sessionId); + filterChain.doFilter(request, response); + } finally { + loggingResponse(response, sessionId); + response.copyBodyToResponse(); + } + } + + private void loggingRequest(ContentCachingRequestWrapper request, String sessionId) { + log.info("session ID: {} Request - method: {} uri: {}", sessionId, request.getMethod(), request.getRequestURI()); + log.info("session ID: {} Request - params: {}", sessionId, new String(request.getContentAsByteArray(), StandardCharsets.UTF_8)); + } + + private void loggingResponse(ContentCachingResponseWrapper response, String sessionId) { + log.info("Session ID: {} Response - status: {} Content-Type: {}", sessionId, response.getStatus(), response.getContentType()); + + if (isLoggingContentType(response.getContentType())) { + log.info("Session ID: {} Response - body: {}", sessionId, new String(response.getContentAsByteArray(), StandardCharsets.UTF_8)); + } + + } + + /** + * 로깅을 제외할 content type 추가 + */ + private boolean isLoggingContentType(String contentType) { + return Stream.of( + "text/html" + ).noneMatch(contentType::contains); + } + + /** + * 필터를 제외할 URI + */ + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + return Stream.of( + "/login", + "/logout", + "/error", + "/css", + "/js", + "/images", + "/favicon.ico", + "/common/modal", + "/font" + ).anyMatch(s -> request.getRequestURI().contains(s)); + } +}