Interceptor
- Controller에 들어오는 request와 response를 가로채는 역할
- 관리자 인증을 하는 용도로 사용할 수 있음
- 서블릿의 앞, 뒤에서 request와 response를 가로채는 filter와 역할이 유사
Filter vs Interceptor
- 호출 시점
- Filter: DispatcherServlet이 실행되기 전
- Interceptor: DispatcherServlet이 실행된 후
- 설정 위치
- Filter: web.xml
- Interceptor: spring-servlet.xml
- 구현 방식
- Filter: web.xml 입력
- Interceptor: 메서드 구현 필요
Interceptor의 구현
- HandlerInterceptor 인터페이스 구현
- preHandle(): 컨트롤러가 호출되기 전 실행. obj 파라미터는 컨트롤러의 메서드를 참조 할 수 있는 HandlerMethod 객체
- postHandle(): 컨트롤러가 실행된 후 호출
- afterComplete(): 뷰에서 최종 결과가 생성하는 일을 포함한 모든 일이 완료 되었을 때 실행
- 각 메서드의 반환값이 true이면 핸들러의 다음 체인이 실행되지만, false일 경우 남은 인터셉터와 컨트롤러가 실행되지 않음
- HandlerInterceptorAdapter 클래스 상속
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
Filter, Interceptor, AOP
- Interceptor와 Filter: Servlet 단위에서 실행
- AOP: Proxy 패턴의 형태
Filter
- 요청과 응답을 필터링
- 자원의 앞단에 위치하여 여러가지 체크 가능
- 처리가 끝난 후 응답 내용에 대해서도 변경하는 처리 가능
- 인코딩 터리, XSS 방어 등의 처리로 사용
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 패턴을
/*
로 지정하면 servlet, jsp 뿐 아니라 이미지와 같은 모든 자원의 요청에도 호출됨
- init(): 필터 인스턴스 초기화
- doFilter(): 전/후 처리
- destroy(): 필터 인스턴스 종료
Interceptor
- 요청에 대한 작업 전/후로 가로챔
- 필터는 스프링 컨텍스트 외부에 존재. 스프링과 무관한 자원에 대해 동작
- 인터셉터는 스프링 컨텍스트 내부에서 컨트롤러에 대한 요청과 응답 처리
- 모든 스프링 빈 객체에 접근 가능
- 여러 개 사용 가능
AOP
- OOP를 보완하기 위한 개념
- 인터셉터와 필터와 달리 메서드 전후의 지점에 자유롭게 설정 가능
- 인터셉터와 필터는 주소로 대상을 구분해서 걸러내는 반면, AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상 지정 가능
- AOP는 파라미터가 JoinPoint나 ProceedingJoinPoint
- 인터셉터는 HttpServletRequest, HttpServletResponse를 파라미터로 사용
url mapping
/
: 루트
/*
: 바로 아래 단계 하위 경로까지
/**
: 모든 하위 경로