Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.
인증/인가를 받아야 사용할 수 있는 웹사이트가 있다고 가정하자.
로그인(인증) 하고 어떠한 기능을 사용하고자 할때(권한) 컨트롤러를(api) 통해 기능을 요청할것이다.
이때마다 서버에서는 (1)올바른 사용자가 맞는지, 맞다면 그 (2)기능을 사용 할 수있는 권한이 있는지 체크할것이다.
그럼, 1000개의 기능이 있다면 위와 같은 체크를 1000번 해야할까?
이럴때 filter, interceptor로 사용자의 요청을 가로채 특정 기능을 수행 할 수있도록 제어 할 수있다.
이렇게만 봤을때, 둘이 같은거 아닌가? 생각 할 수도 있다. (내가..)
결론적으로, 두 개 모두 '요청' 과 '응답' 전후에 작업을 처리하는 용도로 사용되지만, 호출 시점이 다르다.
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) throws IOException, ServletException;
public void destroy();
}
J2EE 표준. spring framework에서 지원하고 있지만 spring framework만의 기능은 아니다.
servlet container에 의해 동작이 제어되는것으로, DispatcherServlet 이전에 실행된다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다. 대표적인 예로는 Spring Security, CORS Filter
등이 있다.
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle( HttpServletRequest request, response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
Spring Framework에서 자체적으로 제공하는 기능.
스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전,후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
Spring context내에서 HTTPRequest 와 HTTPResponse 처리에 대해 강력한 기능을 제공한다.
보통 클라이언트를 통해 들어오는 디테일한 처리(세션체크,인증,권한)에 대해서는 이곳에서 처리한다.
https://goddaehee.tistory.com/154
https://junghyungil.tistory.com/123
https://jaehun2841.github.io/2018/08/25/2018-08-18-spring-filter-interceptor/#filter
https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter