Spring Boot: Filter

김아무개·2023년 6월 6일
0

Spring Boot 🍃

목록 보기
29/95

보고 배운 인강 링크

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 {
	...
}





profile
Hello velog! 

0개의 댓글