개발/[Basic]
[Basic] Filter & Interceptor
바켱서
2020. 6. 14. 23:51

Spring MVC 구조를 잘 알려주는 도식도로 Filter와 Interceptor의 실행 위치를 봐보자.
Filter
- Dispatcher Servlet 이전에 실행 [ WAS내의 ApplicationContext에서 등록된 필터가 실행 된다. ]
- Application Context에 등록 된 필터가 요청 URL Pattern에 따라 실행
- Spring Security, CORS Filter 등
구현 방법
package com.example.springstudy.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
package com.example.springstudy.filter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@Component
@WebFilter(
description = "1번째 필터",
urlPatterns = "/*",
filterName = "Test-Filter1"
)
@Order(1)
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//filter 생성 시 처리
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//다음 Filter 실행 전 처리 (preHandle)
//다음 filter-chain에 대한 실행 (filter-chain의 마지막에는 Dispatcher servlet실행)
filterChain.doFilter(servletRequest, servletResponse);
//다음 Filter 실행 후 처리 (postHandle)
}
@Override
public void destroy() {
//filter 제거 시 처리 (보통 자원의 해제처리를 한다.)
}
}
Interceptor
- DispatchetServlet 내부에서 실행
- Spring Framework에서 제공하는 API
- preHandle(), postHandle() 메소드가 구분 되어져 있어, 분기가 명확하다.
- 주로 세션에 대한 체크, 인증 처리, 특정 상품 진입 시, 권한 체크, 제약 조건 체크들 ,등에 사용
Interceptor 동작 방식
- 외부로 부터 요청이 들어오면 DispatcherServlet에서 요청을 처리한다.
- DispatcherServlet의 doDispatch() 메소드에서 getHandler() 메소드로 HandlerExecutionChain를 호출 한다. (정확히는 RequestMappingHandlerAdapter의 HandlerExecutionChain)
- getHandler() 메소드 내부에는 getHandlerInternal() 메소드로 handler를 가져오는 부분이 있다. 이 부분이 바로 요청 URL과 매칭하는 Controller 메소드를 찾아내는 부분이다.
- 그 다음 getHandlerExecutionChain() 메소드에서 요청 메소드의 URL에 대해 이미 등록 된 interceptor 들의 url-pattern들과 매칭 되는 interceptor 리스트를 추출한다.
- 추출 된 interceptor들에 대해 preHandle() 메소드를 실행 시킨다. (preHandle() 메소드의 리턴 타입은 boolean인데 false가 리턴 되는 경우에는 Controller 메소드를 실행 하지 않는다.)
- 그 다음 요청 URL에 맞는 Controller 메소드를 실행 시킨다.
- 메소드 작업이 끝난 뒤 추출 된 interceptor들에 대해 postHandle() 메소드를 실행 시킨다.
참고 문헌
https://jaehun2841.github.io/2018/08/25/2018-08-18-spring-filter-interceptor/#interceptor