Today
-
Yesterday
-
Total
-
  • Spring Boot: Filter
    Spring 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

Designed by Tistory / Custom by 얼거스