스프링을 개발하다보면 공통적인 처리를 위해 Filter를 개발해야 하는 경우가 있다.
Filter를 다양한 방식으로 등록할 수 있는데 잘 모르고 사용해서 당황했던 경험이 있어서 정리해본다.
Spring은 Filter 타입의 Bean을 자동으로 FilterRegistrationBean타입으로 변경하고, FilterRegistrationBean 타입의 빈을 /*
에 매치되도록 등록한다.
spring의 ServletWebServerApplicationContext.selfInitialize()
과 ServletContextInitializerBeans
에서 관련 코드를 찾을 수 있었다.
만약 Filter를 bean으로 사용하고 싶은데, 자동으로 등록되는게 싫다면 아래처럼 등록해줘야 한다.
@Bean
fun timestampFilter() : FilterRegistrationBean<TimestampFilter> {
val filter = FilterRegistrationBean(TimestampFilter())
filter.isEnabled = false
return filter
}
Filter는 외부의 요청에 대해 한번만 실행되는 것처럼 보이지만, 정확히는 서블릿으로 dispatch할때 한번 실행되는 것이다.
일반적인 경우 한번의 dispatch가 발생하겠지만, 사실 request는 다른 서블릿으로 dispatch가 가능한 구조이다.
Spring security에서 주로 사용되는데, spring security는 필터체인으로 구성되어있고, 인증을 처리하는 과정은 요청 전체에서 한번만 진행되면 되기 때문에 OncePerRequestFilter를 사용한다.