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