* Interceptor 와 Filter 의 차이점 

 

 

 

 

 

Spring MVC 요청 처리 흐름

 

 

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를 사용하려면?

           출처: http://credemol.blogspot.kr/2011/03/filter-spring-di.html

 

<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를 이용하여 필터를 작성할 수 있다.

 

Posted by wychoi
,