◆ 인터셉터( Interceptor )
웹 요청 시 Controller로 가는 요청을 가로 채 전후 처리를 할 수 있도록 하는 역할
▶ 인터셉터와 필터의 차이?
필터 역시 전/후처리를 하는 역할로 인터셉터와 같은 기능을 수행하지만 둘의 특징에 따라 사용하는 용도가 조금 달라질 수 있다.
( 필터는 주로 문자 인코딩 설정등에 사용됨 )
-
- 실행 시점이 다르다.
- Spring MVC request life cycle Request -> Filter -> DispatcherServlet -> Controller/Interceptor
-
- 접근영역이 다르다.
- Fileter는 웹 어플리케이션에 등록(web.xml)하고, Interceptor는 Spring Context에 등록한다.
▶ 인터셉터 설계
1. HandlerInterceptor구현 또는 HandlerInterceptorAdapter를 상속하는 클래스 작성
2 메서드 설계
-
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-
Controller가 실행되기 전
실행되는 메서드 true를 리턴할 경우 Controller로 요청을 보낸다.
-
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
-
Controller가 실행된 후
View렌더링 직전 호출 매개인자의 ModelAndView객체에 Controller가 넘겨주는 값들이 저장된다.
-
- afterCompletion()
- View(화면)처리까지 끝난 후에 호출
3. Spring Context에 등록
인터셉터가 적용될 경로와 함께 등록 시켜주도록 한다.
<!-- 인터셉터 객체 생성 -->
<bean id="ti" class="interceptors.TestInterceptor"/>
<!-- Interceptor 설정 -->
<interceptors>
<interceptor>
<mapping path="/board/register"/>
<mapping path="/board/modify"/>
<mapping path="/board/delete"/>
<beans:ref bean="ti"/>
</interceptor>
</interceptors>
아래와 같은 방식으로 어노테이션 핸들러 매핑을 등록할 때 같이 등록하는 방식도 가능하다.
어노테이션 매핑은 bean으로 등록하지 않아도 처리 가능하나, 인터셉터를 아래와 같은 방식으로 등록할 때는 아래와 같이 등록해야한다.
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
p:alwaysUseFullPath="true">
<property name="interceptors">
<list>
<ref bean="cmLoginInterceptor" />
<ref bean="cmInterceptor" />
</list>
</property>
</bean>
▶ ex
public class TestInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object obj = session.getAttribute("login");
if ( obj ==null ){
response.sendRedirect("/login");
return false;
}
return true;
}
}