티스토리 뷰

728x90
반응형
필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
라고 나와 있는데 걍 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후에 처리하는 것을 말합니다.
더 간단하게 얘기하면 클라이언트로부터 요청한 내용을 servlet으로 전송이 되는데 그전에 한번 걸러내는 작업을 하는 역할이 filter 라고 합니다.
Filter
필터(Filter) 인터페이스는 init, doFilter, destroy 로  구성되어있다.
public interface Filter {

    public default void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain) throws IOException, ServletException;

    public default void destroy() {}

}

 

Filter 상속한 TestFilter 메소드
public class TestFilter implements Filter{ 
	@Override 
	public void init(FilterConfig fConfig) throws ServletException { 
		 Filter.super.init(fConfig); 
	} 
	@Override 
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
			throws IOException, ServletException { 
		chain.doFilter(request, response); 
	} 
	@Override 
        public void destroy() { 
		Filter.super.destroy(); 
	} 
}

 

Filter 적용 방법
어노테이션 적용 설정
  • @ServletComponentScan Application 클래스에 선언
  • @Component를 선언하게 되면 해당 filter를 전체 적용이 됩니다.
  • 특정 url에서 사용하고자 한다면 @WebFilter(urlPatterns = "/test/*") 등 특정 url을 이용하여 사용할 수 있습니다.
  • @Order를 통해서 Filter 들간에 실행 순서를 설정할 수 있습니다.
@ServletComponentScan 예시)
@ServletComponentScan
@SpringBootApplication 
public class TestApplication { 
	public static void main(String[] args) { 
		SpringApplication.run(TestApplication.class, args); 
	} 
}
Filter 설정 예시)
@Component
public class TestFilter implements Filter{

@WebFilter(urlPatterns = "/test/*")
public class TestFilter implements Filter{

@WebFilter(urlPatterns = "/test/*") 
@Order(1)
public class TestFilter implements Filter{

 

어노테이션 x 적용 설정
FilterRegistrationBean 사용
해당 객체를 이용할 경우 @ServletComponentScan을 포함하여 필터 관련 어노테이션을 사용할 필요가 없다.
TestFilter 클래스
public class TestFilter implements Filter{
FiltersConfig( 예시 메소드)
@Configuration 
public class FiltersConfig { 
        //Test2 
	@Bean 
	public FilterRegistrationBean<TestFilter2> test2Filter(){ 
		FilterRegistrationBean<TestFilter2> registrationBean = new FilterRegistrationBean<>(); 
		registrationBean.setFilter(new AllowIpFilter()); //해당 filter 
		registrationBean.addUrlPatterns("/test/*"); //특정 url
		registrationBean.setOrder(2); //순서 
		registrationBean.setName("allowIp-filter"); //필터 이름 
		return registrationBean; 
	} 
        //Test1
	@Bean 
	public FilterRegistrationBean<TestFilter> testFilter(){ 
		FilterRegistrationBean<TestFilter> registrationBean = new FilterRegistrationBean<>(); 
		registrationBean.setFilter(new UserAgentFilter()); 
		registrationBean.addUrlPatterns("/*");// 모든 url 적용 
		registrationBean.setOrder(1);//순서
		registrationBean.setName("agent-filter"); 
		return registrationBean; 
	} 
}
 
order 를 선언하여 처리했을때 결과
아래 내용과 같이 order 순서를 지정한 순서대로 TestFilter -> TestFilter2로 체크되는 것을 확인할 수 있다.

필터 순서에 따른 결과

@ServletCoponentScan을 이용하면 단점 세사한 filter처리 하고자 하거나 여러 filter를 처리하고자 할때 제안적일 수 있다.
그러므로 FilterRegistrationBean  사용 추천
728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함