Domain/Spring

Filter

by Donghwan 2023. 1. 28.

  • Filter는 J2EE 표준 스펙 기능으로 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공합니다.
  • Front Controller인 Dispatcher Servlet의 앞에서 동작합니다. 따라서 Filter는 Spring의 범위 밖에서 동작하고 처리됩니다.
  • Filter는 Spring Bean으로 등록은 되지만 Spring Container가 아닌 톰캣과 같은 Web Container에 의해 관리됩니다.
  • Filter는 FilterChain을 통해 연쇄적으로 동작하도록 할 수 있습니다.
  • Spring에서 Filter를 구현하기 위해서는 javax.servlet.Filter 인터페이스를 구현하여 사용할 수 있습니다. Filter Interface는 init, doFilter, destory 함수를 제공합니다.
    • init() init은 초기화 로직을 수행하는 함수로 말 그대로 최초 생성될 때 실행됩니다.
    • doFilter(ServletRequest request, ServletResponse response, FilterChain chain) doFilter 함수는 Request, Response가 필터를 거칠 때 수행되는 함수입니다.
    • destory() destroy() 함수는 필터가 소멸될 때 실행되는 함수입니다.
  • doFilter 함수를 통해 Request와 Response에 대한 접근이 가능합니다. 따라서 공통된 보안 및 인증/인가 작업, 모든 요청에 대한 로깅, 이미지/데이터 압축 및 문자열 인코딩, Spring과 분리되어야 하는 기능을 수행하는데 적합합니다.
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class BasicFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("[BasicFilter] init...");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("[BasicFilter] doFilter start...");
        chain.doFilter(request, response);
        log.info("[BasicFilter] doFilter end...");
    }

    @Override
    public void destroy() {
        log.info("[BasicFilter] destroy...");
    }
}
728x90
반응형

'Domain > Spring' 카테고리의 다른 글

Spring Security  (0) 2023.05.31
[Spring] Logging과 LoggingFramework  (0) 2022.09.02
[Spring] Web.xml  (0) 2021.11.30
[Spring] JPA 영속성 컨텍스트  (0) 2021.11.18
[Spring] Context ( RootContext, ServletContext )  (0) 2021.11.18

댓글