-
Spring Boot: FilterSpring Boot 🍃 2023. 12. 4. 00:01
Filter 필터
-
Web Application에서 관리되는 영역
-
Spring Boot Framework에서 Client로 부터 오는 요청/응답에 대해 최초/최종 단계의 위치에 존재하며, 이를 통해서 요청/응답 정보를 변경하거나, Spring에 의해서 데이터가 변환되기 전의 순수한 Client의 요청/응답 값을 확인 할 수 있다.
-
유일하게 ServletRequest , ServletResponse의 객체를 변환할 수 있다.
-
주로 요청/응답의 Logging 용도로 활용하거나, 드물게 인증과 관련된 로직들을 해당 필터에서 처리한다.
-
이를 선/후 처리 함으로써 Service business logic과 분리시킨다.
실습1 : 모든 경로 요청값 logging
Filter 클래스 생성 후
jakarta.servlet.Filter
인터페이스 상속. Spring boot에서 관리할 수 있게@Component
어노테이션 붙여줌import jakarta.servlet.*; @Component public class GlobalFilter implements Filter { }
doFilter 메서드만 오버라이드 한다.
import jakarta.servlet.*; import java.io.IOException; @Component public class GlobalFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 전처리 구간 var httpServletRequest = new ContentCachingRequestWrapper((HttpServletRequest) request); var httpServletResponse = new ContentCachingResponseWrapper((HttpServletResponse) response); chain.doFilter(httpServletRequest, httpServletResponse); // 후처리 구간 String reqContent = new String(httpServletRequest.getContentAsByteArray()); String url = httpServletRequest.getRequestURI(); log.info("request url : {} , request body {}", url , reqContent); String resContent = new String(httpServletResponse.getContentAsByteArray()); int httpStatus = httpServletResponse.getStatus(); log.info("response status : {} , response body {}", httpStatus , resContent); httpServletResponse.copyBodyToResponse(); // copyBodyToResponse 를 호출해주어야 반드시 클라이언트가 제대로 된 응답을 받을 수 있다. } }
실습2 : 특정 경로 요청값 logging
실행 메서드가 있는 Application 파일에
@ServletComponentScan
어노테이션을 붙여준다.@SpringBootApplication @ServletComponentScan public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
Filter 파일로 돌아가서 먼저 붙여놓았던
@Component
어노테이션을 지우고@WebFilter(urlPatterns = "/path/uris/*")
어노테이션을 붙여준다.이 때,
urlPatterns
로는 읽어서 처리할 경로를 입력해주면 된다.@Slf4j @WebFilter(urlPatterns = "/filter/user/*") public class GlobalFilter implements Filter { ... }
'Spring Boot 🍃' 카테고리의 다른 글
Spring Boot: Interceptor 인터셉터 (0) 2023.12.05 spring boot: Slf4j (0) 2023.12.05 Spring Boot: Exception 처리 (0) 2023.12.04 정규식 모음 (0) 2023.12.04 Spring Boot: 유효성 검증 Validation (0) 2023.12.04 -