본문 바로가기

오픈소스프레임워크/Spring

[Spring] Interceptor 와 Filter의 차이점

* Interceptor 와 Filter 의 차이점 





Spring MVC 요청 처리 흐름
Spring Handler Interceptors


1. 호출 시점이 다르다.

    둘다 컨트롤러가 호출되기 전에 호출되어 실행된다. 하지만  Filter는 Dispatcher가 호출되기전에, Interceptor는 Dispatcher가 호출되고 난뒤 호출된다.  

필터는 일반적으로 서블릿 컨테이너에서 제어하기 때문에 web.xml에서 정의하여야 하며, 스프링 애플리케이션에서 관리하는 빈을 DI로 받을 수 없다.

인터셉터는 dispatcher-servlet.xml 에서 컨트롤러에 대해 인터셉터를 정의하며, 스프링 애플리케이션에서 관리하는  빈을 DI로 받아서 사용한다.


2. 각 인터페이스에서 정의하고 있는 함수의 용도가 차이가 있다.

* Spring MVC 에서 interceptor 

org.springframework.web.servlet.HandlerInterceptor , 
org.springframework.web.servlet.handler.HandlerInterceptorAdapter 를 상속받아 Interceptor를 구현한다,

HandlerInterceptor 를 상속할 경우 다음 3가지 메서드를 재정의한다.

preHandle() :        Controller 가 수행되기 전에 호출된다.
                               처리결과에 따라 이후 Controller를 수행할지 여부를 boolean 으로 return 한다.
postHandle :         Controller 가 수행된후 View 를 호출하기 전에 호출된다.
afterCompletion : View 작업까지 완료된 후 호출된다. 
                               responseBody 를 이용할 경우 UI 에 이미 값을 전달후 해당 부분이 호출된다.

* Filter 
 - init() : 필터 인스턴스 초기화
 - doFilter() : 전/후 처리
 - destroy() : 필터 인스턴스 종료

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException { // 전 처리 chain.doFilter(request, response); // 후 처리 }




<참고> Filter에서 스프링DI를 사용하려면?
  <filter>
    <filter-name>restfulAuthFilter</filter-name>
    <filter-class>
      com.archnal.securityweb.web.RestfulAuthFilter
    </filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>restfulAuthFilter</filter-name>
    <url-pattern>/ws/rest/secure/*</url-pattern>
  </filter-mapping>
  

이런 경우 스프링컨텍스트의 DI를 이용해서 필터를 구현하고자 하는 경우에는 아래와 같이 web.xml 파일을 설정해야 한다.

  <filter>
    <filter-name>restfulAuthFilter</filter-name>
    
    <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>

    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>restfulAuthFilter</filter-name>
    <url-pattern>/ws/rest/secure/*</url-pattern>
  </filter-mapping>  


주의해야 할 점은 filter-name과 필터 클래스의 빈 이름이 동일해야 한다.

위의 필터의 타입레벨 annotation으로 @Service("restfulAuthFilter") 설정된 restfulAuthFilter가 filter-name으로 사용되어야 한다.

위와 같이 web.xml 파일을 설정하면 스프링의 DI를 이용하여 필터를 작성할 수 있다.