Pages

2014년 12월 19일 금요일

[SPRING] Interceptor & Filter

스프링에서 전후처리기 를 담당하는 Interceptor Filter가 있습니다.

기능만 보면 Interceptor와 Filter는 비슷해 보입니다. Filter로 해야 되는 일들은 

Interceptor로 구현 할 수 있습니다.

Spring Interceptor 설정파일을 보면 

<spring-servlet.xml>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     <mvc:interceptors>
 
        <mvc:interceptor>
 
           <mvc:mapping path="/api1/*" />  
 
           <mvc:mapping path="/api2/*" />  
 
           <mvc:mapping path="/api3/*" />  
 
           <bean class="com.test.interceptor.RequestInterceptor" />
 
         </mvc:interceptor>
 
    </mvc:interceptors>

위 부분은 api1,2,3 호출되기전에 RequestInterceptor Class를 먼저 호출

하는 것입니다. 

Filter 부분 설정을 보면

<web.xml>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <filter>
 
        <filter-name>필터이름</filter-name>
 
        <filter-class>com.test.filter.RequestFilter</filter-class>
 
    </filter>
 
    <filter-mapping>
 
        <filter-name>필터이름</filter-name>
 
        <url-pattern>/*</url-pattern>
 
    </filter-mapping>
위 부분은 필터먼저 호출하고 페이지를 호출하겠다는 것입니다.

이렇게 보면 위 두 Interceptor와 Filter 부분이 비슷하다고 볼 수 있습니다.

아래 그림을 보면 Spring 에서 Request가 어떻게 흐르는지 알 수 있습니다.


일단 호출되는 시점이 다르다. 

Interceptor나 Filter나 Controller에 진입하기 전에 작업을 처리를 위해 사용하므로 

차이 없어 보일 수 있으나 위의 그림을 보면 호출되는 시점이 다르다는걸 알 수 있

습니다.

Filter의 경우는 Interceptor와 다르게 설정 정보를 web.xml에 작성합니다.

멤버함수의 용도도 다릅니다.

Interceptor 
preHandle() : Controller  진입 전
postHanle() : Controller 진입 후 view로 보내기 전
afterCompletion() : view까지 끝나고 나서


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


doFilter 함수는 아래처럼 작성 됩니다.



1
2
3
4
5
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 전 처리   
        chain.doFilter(request, response);
        // 후 처리
}
Filter는 doFilter 함수에서 전후 처리를 모두 담당하는데 doFilter가 요청 전과 후, 

두번 호출되는 방식입니다.

Filter는 J2EE 표준 스펙에 나와있는 Servlet 기술 중 일부라서 web.xml에 기술

는 것이며, Interceptor는 비슷한 기술이지만, Spring에 녹인것으로 보입니다.

Spring 기반으로 한다면 당연히 Filter보단 Interceptor를 사용하고 Spring 없이 

단순 Servlet구현이라면 Filter를 사용해서 사용하면 될 것 같습니다.





댓글 없음:

댓글 쓰기