admin: 로깅 공통 필터 추가
This commit is contained in:
parent
b275e12d8c
commit
e5f350630f
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue