@WebFilter

배세훈·2021년 12월 24일
0

Spring

목록 보기
28/38

@WebFilter란?

  • Filter 등록을 위한 Annotation
  • Servlet 3.0 이상 사용 가능
  • 톰캣 7이상에서 사용 가능

@WebFilter Annotation 설정

1. 필터 이름 지정 방법

@WebFilter(filterName = "loggingFilter")
public class LoggingFilter implements Filter{}

2. 필터링 경로 설정 방법

1) Annotation 맵핑 URL을 입력하는 방법
@WebFilter("/target")

2) Annotation 와일드카드 사용하는 방법
@WebFilter("/*")

3) Annotation value 속성 이용 방법

@WebFilter(value="/target") // 한개
@WebFilter(value="/target", "/target2"}) // 여러개 동시에

4) Annotation urlPatterns 속성

@WebFilter(urlPatterns="/target") // 한개
@WebFilter(urlPatterns={"/target", "/target2"}) // 여러개 동시에

5) 서블릿 등록시 사용한 서블릿 이름을 기준으로 지정하는 방법

@WebFilter(servletNames="boardController")
@WebFilter(servletNames={"boardController", "boardController2"}) // 여러개 등록

3. @WebFilter 초기 파라미터 설정 방법

@WebFilter(
	value = {"/target", "/target2"},
    initParams=@WebInitParam(name="encoding", value="UTF-8")
)
public class EncodingFilter implements Filter{}

만약 설정값을 여러개 주어야 한다면 배열 형태로 지정해 줄 수 있습니다.

@WebFilter(
	initParams={
    	@WebInitParam(name="encoding", value="UTF-8"),
        @WebInitParam(name="encoding2", value="EUC-KR")
    }
)

4. Dispatcher 지정하기

@WebFilter(
	dispatcherTypes={
    	DispatcherType.REQUEST,
        DispatcherType.INCLUDE
    }
)
public class FirstFilter implements Filter{}

5. Filter 예제

@Slf4j
public class MyFilter implements Filter{
	
    @Override
    public void init(FilterConfig filterConfig) throws ServletException{
    	log.info("init MyFilter");
    }
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{
    	log.info("doFilter MyFilter, uri : {}", ((HttpServletRequest)servletRequest).getRequestURI());
        filterChain.doFilter(servletRequest, servletResponse);
    }
    
    @Override
    public void destory(){
    	log.info("destroy MyFilter");
    }
}
방법1: FilterRegistrationBean
@SpringBootApplication
public class Method1Applicatoin{
	public static void main(String[] args){
    	SpringApplication.run(Method1Application.class, args);
    }
    
    @Bean
    public FilterRegistrationBean setFilterRegistration(){
    	FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter();
        filterRegistrationBean.addUrlPatterns("/filtered/*");
        return filterRegistrationBean;
    }
}
방법2: @WebFilter 설정
@Slf4j
@WebFilter(urlPatterns="/filtered/*")
public class MyFilter implements Filter{

}
주의점

@WebFilter에 @Componet를 붙이면 @WebFilter가 실질적으로 호출되는 영역에서는 2번 호출되지 않는 영역에서는 1번 호출됨

이유는 스프링 부트에는 @SpringBootApplication이 있고 그 안에는 @ComponentScan이 있어서 빈들을 자동으로 등록해주는 역할을 하게 되는데 필터에 @Component가 설정되어 있어 자동으로 등록이 되었고 @WebFilter + @ServletComponentScan 조합으로 한번 더 등록되어 총 2번 등록된 상황이 발생했기 때문이다

// Main 클래스에 @ServletComponentScan 또는 Filter에 @Component로 등록해줘야 @WebFilter가 정상 작동함.

profile
성장형 인간

0개의 댓글