[Spring] Interceptor and Filter

Interceptor And Filter in Spring


Spring에서 Interceptor와 Filter은 서로 같은 기능을 수행한다.

유사점 : 
1. filter와 Interceptor은 처리 방식에 있어서는 서로 동일하다.
2. 비즈니스 로직을 처리하기 전에 처리해야할 전처리를 수행하게 할수 있고.
3. 비즈니스 로직을 수행후에 해야할 후처리 작업을 수행할 수 있다.
4. 또한 지정된 request에 대해서만 filter나 interceptor가 동작하도록 제어할 수 있다.
5. 둘다 설정파일에 기술한 순서대로 실행이 된다.

차이점 : 
1. 호출시점 : 
  - Filter : Servlet이 수행되기 이전, 그리고 이후에 처리된다.
  - Interceptor : Dispatcher Servlet 호출 이후 Handler가 처리되기 이전, 그리고 이후에 실행된다.

  - 아래 그림을 확인해보면 명확하다.


2. 메소드 시그너처의 차이
2.1 Filter : 
  - init() : 필터 초기화
  - doFilter() : 전, 후처리용 메소드, 내부에서 filterChain.doFilter를 호출하여 해당 비즈니스처리를 계속해서 수행할 수 있다.
  - destory() : 필터 종료이후 실행.

2.2 Interceptor : 
  - preHandle() : 핸들러가 수행되기 전에 실행됨.
  - postHandle() : 핸들러가 수행되고 나서 실행됨.
  - afterCompletion() : View작업까지 완료되고 나서 실행됨.

3. 파라미터의 차이
- Filter는 ServletRequest, ServletResponse등을 받게 된다.
- Interceptor은 HttpServletRequest, HttpServletResponse, 그리고 대상핸들러 등을 받아서 처리할 수 있다.

# ServletRequest와 HttpServletRequest의 차이.
SERVLETREQUESTHTTPSERVLETREQUEST
javax.servlet패키지에 포함됨. javax.servlet.http 패키지에 포함됨. 
ServletRequest의 하위 인터페이스임
getParameter()와 같은 많은 메소드를 제공 ServletRequest의 다양한 메소드를 상속받음.
getQueryString()등과 같은 추가 메소드를 제공함
HTTP프로토콜의 헤더, 바디, 컨텐츠타입, 쿠키, 세션등  다양한 정보를 쉽게 사용할 수 있도록함. 
GenericServlet과 함께 사용됨. HttpServlet과 함께 사용됨. 
프로토콜에 독립적으로 사용가능 프로토콜에 독립적이나, HTTP프로토콜 에 특화되어 사용 
HTTP가 사용되지 않았을때 클라이언트에서 요청이 들어오면 web container는 servletRequest 객체를 생성하고 service()메소드로 전달하는 방식으로 운용되었다. 클라이언트에서 요청이 HTTP프로토콜을 이용하여 들어온경우 Web container는 HttpServletRequest 객체를 생성하고 service()메소드에 전달하여 사용한다.
from : http://way2java.com/servlets/java-made-clear-difference-servletrequest-httpservletrequest/


3. 설정하기. 
3.1 Filter 설정 

<filter>
  <filter-name>testFilter</filter-name>
  <filter-class>com.unclebae.filter.test.TestFilter</filter-class>
  <init-param>
    <param-name>name</param-name>
    <param-value>KIDO</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>testFilter</filter-name>
  <url-pattern>/test/*</url-pattern>
</filter-mapping>

3.2 Interceptor 설정 

spring-context.xml

...
<interceptors>
  <interceptor>
    <mapping path="/test" />
    <beans:bean class="com.unclebae.interceptor.test.TestInterceptor"></beans:bean>
  </interceptor>
</interceptors>

4. 소스구조 
4.1 Filter 소스구조. 
package com.unclebae.testMvc.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
// 필터 초기화
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 1. 선처리  작업
// 2. 다음처리 진행.
chain.doFilter(request, response);
// 3. 후처리 진행.
}
@Override
public void destroy() {
// 초기화 했던 작업들을 릴리즈 한다. }
}


4.2 Interceptor소스구조. 
- HandlerInterceptorAdapter를 이용한 소스 (Adapter은 인터페이스를 사전에 구현한 소스임)
package com.unclebae.testMvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class TestInterceptorUsingAdapter extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 전처리 수행
// true반환시 다음 실행, false실행시 다음 실행 불가 .
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//후처리 수행.
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 모든 view가 렌더를 마치고 수행.
}
}

- Interceptor 인터페이스를 이용한 소스
package com.unclebae.testMvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
// TODO Auto-generated method stub
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object object, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}


Share this

Related Posts

Previous
Next Post »