1. Interceptor란?

Interceptor는 컨트롤러에 들어오는 요청(HttpRequest), 컨트롤러의 응답(HttpReesponse)를 가로채는 역할을 한다. 정식 명칭은 Handler Interceptor이다.

Interceptor라는 말 자체가 중간에서 가로챈다는 뜻이다.

Interceptor를 만들려면 HandlerInterceptorAdaptor 클래스를 상속받아야 한다. HandlerInterceptorAdaptor 클래스를 상속받으면 preHandle(), postHandle(), afterCompletion() 메소드를 사용할 수 있다.


2. 메소드

  • preHandle() : 클라이언트에서 컨트롤러로 요청을 가로챈다. 즉 컨트롤러가 호출되기 전에 실행된다.
  • postHandle() : 컨트롤러에서 클라이언트로 응답할 때 가로챈다. 즉 컨트롤러가 호출되고 난 후 실행된다.
  • afterCompletion() : 컨트롤러의 처리가 끝나고 화면처리까지 끝나면 실행된다.

3. 활용

관리자만 접근 가능한 관리자 페이지에 접근하기 전 인증 용도 등이다.

만약 Interceptor를 사용하지 않고 로그인 처리를 하면 게시물 작성, 수정, 삭제 등 모든 요청마다 컨트롤러에서 세션에 로그인 정보가 있는지 확인해야 할 것이다. 그러나 Interceptor가 세션에 로그인 정보가 있는지 확인해주는 역할을 한다면 중복 코드를 대폭 줄일 수 있다.

다음은 그 예이다.

package rmrf.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AuthenticationInterceptor 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;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }

}

4. Filter와의 차이점

Filter와 Interceptor는 컨트롤러의 요청을 가로채서 특정 작업을 수행한다는 점에서는 유사점이 있다. 그러나 다음과 같은 차이점이 있다.

4.1. 호출 시점

Filter는 DispatcherServlet이 실행되기 전에 적용되지만, Interceptor는 DispatcherServlet이 실행된 후에 적용된다.

4.2. 범위

Filter는 동일 웹 애플리케이션 내에서만 접근 가능하지만, Interceptor는 스프닝 내의 모든 객체에서 접근 가능하다.

4.3. 표준

Filter는 JEE 표준이지만 Interceptor는 스프링의 기능이다.