개발/[Basic]

[Basic] Filter & Interceptor

바켱서 2020. 6. 14. 23:51

[그림 1]. Spring MVC request life cycle

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 동작 방식

  1. 외부로 부터 요청이 들어오면 DispatcherServlet에서 요청을 처리한다.
  2. DispatcherServlet의 doDispatch() 메소드에서 getHandler() 메소드로 HandlerExecutionChain를 호출 한다. (정확히는 RequestMappingHandlerAdapter의 HandlerExecutionChain)
  3. getHandler() 메소드 내부에는 getHandlerInternal() 메소드로 handler를 가져오는 부분이 있다. 이 부분이 바로 요청 URL과 매칭하는 Controller 메소드를 찾아내는 부분이다.
  4. 그 다음 getHandlerExecutionChain() 메소드에서 요청 메소드의 URL에 대해 이미 등록 된 interceptor 들의 url-pattern들과 매칭 되는 interceptor 리스트를 추출한다.
  5. 추출 된 interceptor들에 대해 preHandle() 메소드를 실행 시킨다. (preHandle() 메소드의 리턴 타입은 boolean인데 false가 리턴 되는 경우에는 Controller 메소드를 실행 하지 않는다.)
  6. 그 다음 요청 URL에 맞는 Controller 메소드를 실행 시킨다.
  7. 메소드 작업이 끝난 뒤 추출 된 interceptor들에 대해 postHandle() 메소드를 실행 시킨다.

 

참고 문헌

https://jaehun2841.github.io/2018/08/25/2018-08-18-spring-filter-interceptor/#interceptor