본문 바로가기

프로그래밍/SPRING 3.X

HandlerInterceptor 사용하기

Spring에서도 Struts2에서 제공하는 interceptor와 똑같은 기능을 HandlerInterceptor를 이용하면 구현할 수 있다..

일단 HandlerInterceptor를 구현해주면 되는데 아래와 같이 3개의 메소드가 있다...


boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)


자세하게 살펴보자면...

일단 3개의 메소드 모두 request와 response를 전달 받고 3번째 파라미터로 Object를 넘겨받는데 여기에 요청을 처리할 Controller가 전달된다.

preHandle() 메소드는 Controller가 요청을 처리하기 전에 호출되는데 리턴 값이 false이면 요청이 더 이상 처리되지 않는다. (다음 HandlerInterceptor나 Controller로 전달되지 않는다.)

postHandle() 메소드는 위와 반대로 Controller가 요청을 처리한 후 동작한다. 이 메소드는 Controller가 처리하다가 오류가 발생하는 경우 호출되지 않는다.

afterCompletion() 메소드는 요청이 모두 처리된 후 (클라이언트가 응답을 받은 후) 실행된다. 따라서 Controller나 View에서 오류가 발생해도 실행된다.


그렇다면 어떻게 사용하느냐??

org.springframework.web.servlet.HandlerInterceptor를 구현해주면 되는데 이럴 경우 필요 없어도 3개의 메소드를 모두 구현해주어야 하는 단점이 있다...

요걸 줄여주기 위해서 HandlerInterceptorAdaptor가 있는데 요걸 사용하면 편하다... (물론 그냥 저 위에꺼 써도 상관 없다...)


public class TestInterceptor extends HandlerInterceptorAdaptor {


      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

            if (request.getParameter("test") == null) {

                  return false;

            }

            

            return true;

      }


 

}


대충 저렇게 구현해서 사용하면 Controller가 실행되기 전에 preHandle() 메소드가 실행되겠다.

그렇다면 XML 설정을 들어가보자..


일단 bean으로 하나 등록해주자...


<bean id="testInterceptor" class="com.test.interceptor.TestInterceptor"/>


그리고 예전에 살펴봤던 HandlerMapping 클래스 중  HandlerInterceptor를 적용할 녀석의 interceptors 프로퍼티 설정에 넣어주면 된다.


<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

      ...

      <property name="interceptors">

            <list>

                  <ref bean="testInterceptor"/>

            </list>

      </property>

      ...

</bean>


요렇게 해주면 HandlerMapping에 등록된 URL에 해당하는 Controller가 실행되기 전에 testInterceptor의 preHandle() 메소드가 실행된다.

interceptors 프로퍼티를 list로 등록하는 것을 보면 여러 개의 HandlerInterceptor를 등록할 수 있다는 것을 알 수 있다...

그렇다면 이런 경우 HandlerInterceptor의 실행 순서가 어떻게 되는지 살펴보자.


Controller 실행 전 : 등록된 순서대로 preHandle() 메소드 실행

Controller 실행 후 : 등록된 순서의 반대로 postHandle() 메소드 실행

요청 처리 후 : 등록된 순서의 반대로 afterCompletion() 메소드 실행


아래와 같이 설정이 되어 있다고 가정하면...


<property name="interceptors">

      <list>

            <ref bean="interceptor1"/>

            <ref bean="interceptor2"/>

      </list>

</property>


실행순서는 아래와 같다..


1. interceptor1.preHandle()

2. interceptor2.preHandle()

3. Controller 요청 처리

4. interceptor2.postHandle()

5. interceptor1.postHandle()

6. View 결과 생성

7. interceptor2.afterCompletion()

8. interceptor1.afterCompletion()

'프로그래밍 > SPRING 3.X' 카테고리의 다른 글

스프링 zip파일 다운받는 주소  (0) 2013.11.21
SimpleUrlHandlerMapping 사용법  (0) 2013.10.09
스프링 진행단계 정리  (0) 2013.10.02
유용한 스프링 관련 강좌.  (0) 2013.09.25
자바 개발에 도움 사이트  (0) 2013.08.20