본문 바로가기
뇌에 쑤셔넣기

[SpringBoot]SpringBoot에서 Filter와 Interceptor 사용하기

by niliso 2023. 1. 2.

Filter

스프링에서 지원하는 기능은 아니고 javaee에서 지원하는 것으로 Dispatcher Servlet 이전에 실행되어 리소스에 대한 요청과 응답에 대해 필터링 작업을 하는 object이다. 인증, 로깅, 암호화 등에 사용할 수 있다.

더보기

Dispatcher Servlet은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)이다.

 

필터의 실행 메소드 종류

  • void init(FilterConfig filterConfig)
    필터 인스턴스 초기화 시 실행되는 메서드
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    필터와 매칭된 클라이언트 요청시 호출되는 메소드.
    필요한 처리로직을 구현 후 파라미터로 받은 FilterChain를 사용해서 다음 대상으로 요청을 넘겨준다.
    서블릿이 실행되기 전에 처리할 작업은 chain.doFilter() 이전에, 서블릿이 실행된 후에 처리할 작업은 chain.doFilter() 이후에 작성해야한다.
  • void destroy()
    필터 종료 메서드로 웹 컨테이너에서 호출되어 서비스가 끝났음을 나타낸다.

 

doFilter 구현 예시

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

@Component
public class RequestResponseLoggingFilter implements Filter {

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
 
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        
        log.info("Logging Request  {} : {}", req.getMethod(), req.getRequestURI()); //서블릿이 실행되기 전에 처리할 작업
        chain.doFilter(request, response);
        log.info("Logging Response :{}", res.getContentType()); //서블릿이 실행된 후에 처리할 작업
    }
}

 


인터셉터 Interceptor

스프링에서 제공하는 기능으로 Dispatcher Servlet이 Controller에 접근하기전에 가로채서 필요한 기능을 수행하도록 한다.

일종의 빈으로 볼 수 있고, 스프링 영역이므로 다른 빈을 활용가능하기 때문에 주로 비즈니스 로직과 관련있는 (세션체크, 권한관리) 공통 작업 처리에 사용된다. 인터셉터는 여러개를 등록해서 사용할 수 있다.

 

인터셉터의 실행 메소드 종류

  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    요청처리 완료 후 즉, 뷰를 렌더링 한 후 실행된다.
  • void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
    비동기 요청 시 PostHandle과 afterCompletion을 대신해서 afterConcurrentHandlingStarted가 수행된다.
  • void  postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    컨트롤러 실행 후 실행된다.
  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    컨트롤러가 실행되기 전에 실행된다.
 

 

인터셉터 preHandle

 

아주아주 간단한 세션 체크 preHandle 구현이다.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       
       if(!"OPTIONS".equals(request.getMethod())){
       	    String sessionId = request.getHeader("session-id");
            
            if(sessionId == null) {
            	throw new Exception("session expired");
            }
        }
        
        return true;
    }
}

 

 

인터셉터 설정

 

인터셉터 작성 후 사용하기 위해서는 WebMvcConfigurer 설정이 필요하다.

import com.test.api.interceptor.ApiInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@EnableWebMvc
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Autowired
    AuthenticationInterceptor interceptor;
    
    private static final String[] common = {"/test/**"};
    private static final String[] exclude = {"/session", "/exclude/**"};

    @Override
    public void addInterceptors (InterceptorRegistry registry) {
        registry.addInterceptor(interceptor)
                .addPathPatterns(common) //적용 대상 url
                .excludePathPatterns(exclude) //적용 제외 대상 url
        ;
    }
}

 

추가

너무 잘 설명해주는 그림이 있어 가져왔다. https://goddaehee.tistory.com/154

👍👍👍👍

 

참고한 자료들

https://goddaehee.tistory.com/154

https://veneas.tistory.com/entry/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%ED%95%84%ED%84%B0-%EC%A0%81%EC%9A%A9-Filter

https://www.baeldung.com/spring-boot-add-filter

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/handler/WebRequestHandlerInterceptorAdapter.html

'뇌에 쑤셔넣기' 카테고리의 다른 글

배포 전략 - Rolling, Blue-Green, Canary 기법  (0) 2023.02.14
CORS  (1) 2023.01.23

댓글