반응형

SpringBoot에서 쉽고 빠르게 Filter를 적용하는 방법을 알아보겠습니다.

FIlter는 서블릿이 지원하는 수문장이다.

 

필터 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿(Spring에서는 dispatcherservlet) -> 컨트롤러

 

필터 특징

1. 특정 URL 패턴에 적용할 수 있다.(/* 모든 요청 적용)

2. 필터 체인을 이용해서 필터를 자유롭게 추가할 수 있다.

 

소스 코드

TestFilter.java

  - Spring에서 Filter는 Filter interface를 구현하면 사용할 수 있다.

  - Filter interface를 구현하게 되면 init, doFilter, destory 3가지 메소드를 Override 하게 된다.(doFilter 메소드는 반드시 구현되어야 한다.)

 

package com.bumblebee.dailyspecial.domain.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Slf4j
public class TestFilter implements Filter {


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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        log.info("TestFilter doFilter");
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        log.info(httpRequest.getRequestURI());
        chain.doFilter(request, response); 
        // 이 부분이 가장 중요하다. 
        //다음 필터가 있으면 필터를 호출하고, 필터가 없으면 서블릿을 호출한다. 
        //만약 이 로직을 호출하지 않으면 다음 단계로 진행되지 않는다.
    }

    @Override
    public void destroy() {
        log.info("TestFilter init");
    }
}

 

init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
doFilter(): HTTP 요청이 올 때 마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다.

destroy(): 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.

 

위에서 작성한 Filter를 등록해준다.

  - WebMvcConfigurer 구현해서 FilterRegistrationBean으로 필터를 등록해준다.

 

package com.bumblebee.dailyspecial.config;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.Filter;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public FilterRegistrationBean TestFilter() {
        // SpringBoot 에서는 FilterRegistrationBean을 이용해서 필터 설정(was 올릴 때 서블릿 컨테이너 올릴 때 알아서 등록을 해준다.)
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new TestFilter()); // 등록할 필터
        filterRegistrationBean.setOrder(1); // 필터 순서
        filterRegistrationBean.addUrlPatterns("/*"); // 필터 적용할 url 패턴

        return filterRegistrationBean;
    }


}

 

TestFilter 출력 화면

was 기동 후 init 메소드 호출
HTTP 요청 후 doFilter 메소드 호출
was 종료 후 destroy 메서드 호출

 

728x90
반응형

+ Recent posts