Spring과 HandlerInterceptor
HandlerInterceptor 소개
HandlerInterceptor 는 Spring 에서 custom interceptor 를 등록할 때 사용하는 interface 이다.
Spring 에서 interceptor 는 웹 서비스에서 필요한 여러가지 기능들을 쉽게 구현할 수 있도록 한다.
interceptor는 주로 검증, 보안, 로깅 등… 시스템 내에서 전체적으로 적용되어야할 기능들을 수행 한다.
스프링에서는 기본적으로 여러가지 Interceptor를 이미 제공하고있는데, Annotation과 같이 사용되면서 강력한 기능들을 제공해 주고 있다. 대표적으로 여러가지 타입의 파라미터를 자동으로 mapping 시켜주는 기능 들을 예로 들 수 있다.
mapping URL pattern을 지정하여, 특정 URL 로 접근하였을 때만 interceptor가 실행되도록 할 수 있다.
Spring에서 Interceptor 동작
- preHandle : 요청 시 Controller 로 진입하기 직전에 실행, boolean 타입의 반환값을 갖는데, false 를 return 하게되면 요청을 거부하게 된다.
- postHandler : 요청 시 Controller 에서 return 되는 과정에서 실행된다. postHandle에 도달하기 전에 Exception 이 발생한다면 Exception 이후의 postHandle 은 생략되게 된다.
- afterCompletion : postHandle 과 달리 Exception 이 발생하더라도 반드시 실행된다. try catch 구문에서 finally 와 비슷한 개념이다.
interceptor 동작 과정을 그림으로 보면 다음과 같다.
interceptor class 선언
HandlerInterceptor interface를 이용하여 다음과 같은 method 들을 override 시키면 된다.
package com.test.test.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Call Interceptor : " + request.getRequestURI());
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
};
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
그런데 만약 세 method 중 preHandle만 필요할 경우 나머지 method를 모두 구현하기 귀찮을 수 있다. 그럴 경우, HandlerInterceptorAdapter를 상속 받아 필요한 method만 사용하면 좀 더 편할 수 있다. http://www.springframework.org/schema/mvc/spring-mvc.xsd