인터셉터(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()을 이용하여 로그인 처리를 하는데 이용된다.
'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글
[Spring] AOP를 적용하여 log찍어보기 (0) | 2018.06.04 |
---|---|
[JavaScript] Check Box를 눌렀을 때 체크한 원소들을 출력(jQuery 3.3.1, JSP) (1) | 2018.05.22 |
[JavaScript] 입력되면 다른 곳에서 똑같이 출력되는 실시간 IO(jQuery 3.3.1, JSP) (1) | 2018.05.22 |
[Spring] Criteria.class(페이징처리, 검색) (0) | 2018.05.21 |
[Spring] list.jsp (페이징처리, 검색) (0) | 2018.05.21 |