인터셉터(interceptor)란 필터(filter)랑 비슷한 역할인 특정 URI에 접근할 때 제어하는 용도로 사용된다.

그럼 왜 필터가 아닌 인터셉터를 사용하는 것일까?

이는 제어하는 위치가 다르기 때문이다.

필터의 경우 서블릿(servlet)에서 제어하기 때문에 웹 애플리케이션 내에서 동작하고, 따라서 스프링의 Context에 접근할 수 없다. 

하지만 인터셉터의 경우, Spring Context내에서 존재하므로 스프링의 모든 객체를 활용 할 수 있게 된다. 따라서 Spring의 빈으로 등록된 컨트롤러나 서비스 객체들을 기존 그대로 주입받아서 사용할 수 있게 된다.


fig 1. 필터와 인터셉터의 차이점(출처: 마시멜로co.  http://marshmello.tistory.com/)




========================= servlet-context.xml =========================


<!-- servlet-context.xml 내용 -->

    

    <!-- interceptor 프로그램 등록 -->

<beans:bean id="sampleInterceptor"

class="org.zerock.interceptor.SampleInterceptor" />


<interceptors>

<interceptor>

<mapping path="/doA"/>

<beans:ref bean="sampleInterceptor"/>

</interceptor>

</interceptors>


========================= servlet-context.xml =========================


인터셉터는 servlet-context.xml에 위처럼 등록해서 사용하게 된다.
<beans:bean>을 이용해 id와 class 위치를 지정해주고 <interceptors>태그를 이용해 어떤 url mapping일 때 동작하는지, <beans:ref>를 이용해서 인터셉터가 작동했을 때 실행되는 클래스가 무엇인지 설정을 해준다.  



========================= Java =========================

// Java 코드


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 SampleInterceptor extends HandlerInterceptorAdapter{


// 처리를 하고 난 뒤에 실행되는 메서드

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception{

System.out.println(getClass().getSimpleName()+".postHandle()");

}

// 처리를 하기 전에 실행되 메서드

// false가 리턴이 되면 처리를 계속 진행하지 않는다. true가 return이 되면 계속진행한다.

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler)

throws Exception{


System.out.println(getClass().getSimpleName()+".preHandle()");

if(request.getParameter("yesNo").equals("yes"))

return true;

else return false;

}

}


========================= Java =========================



인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아 인터셉터로 동작하게 된다. 

부모 클래스에는 
1. preHandle(request, response, handler) - 지정된 컨트롤러의 동작 이전에 가로채는 역할.
2. postHandle(request, response, handler, modelAndView) - 지정된 컨트롤러의 동작 이후에 처리, Spring MVC의 Front Controller인 DispatcherServlet이 화면을 처리하기 전에 동작.
3. afterHandle(request, response, handler, exception) - DispatcherServlet의 화면처리가 완료된 상태에서 처리. 
이렇게 3가지가 있다. 


대부분의 경우 preHandle()을 이용하여 로그인 처리를 하는데 이용된다.




















+ Recent posts