Spring Request Interceptor

Request가 Controller에 도달하기 전에 intercept 할수 있는 방법은 두가지가 있다.
  1. Servlet Filter
  2. Spring Interceptor


차이점

  • Servlet Filter는 J2EE 표준 스펙이지만, Interceptor는 Spring 프레임워크에서 자체적으로 제공하는 기능이다.
  • Servlet Filter는 Dispatcher Servlet 전에 호출되고 Interceptor는 Dispatcher와 Controller 사이에서 호출된다.
  • 아래 그림 참조



정리하면,
Request -> Servlet Filter -> Dispatcher Servlet -> Interceptor -> Controller

HandlerInterceptor vs HandlerInterceptorAdapter

HandlerInterceptor는 Interface이고, HandlerInterceptorAdapter는 이를 구현한 abstract class.
HandlerInterceptor의 모든 interface를 구현하고 싶지 않으면 HandlerInterceptorAdapter를 사용하면 된다.

HandlerInterceptor Methods

  • PreHandle(...)
    • Controller 직전에 실행.
  • PostHandle(...)
    • Controller 수행후 실행.
  • afterComplete(...)
    • Controller 후 view가 전상적으로 랜더링 된 후 제일 마지막에 실행.
  • afterConcurrentHandlingStarted(...)
    • Servlet 3.0부터 가능한 비동기 요청에서 PostHandle()과 afterCompletion() 수행하지 않고 이 메서드를 수행.(Spring에서 제공)


예제


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@Component
public class TestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  log.info("Interceptor > preHandle");
  return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("Interceptor > postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
        log.info("Interceptor > afterCompletion" );
    }
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import com.mhlab.cb.component.interceptors.SessionCheckInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TestInterceptor())
                .addPathPatterns("/*")
                .excludePathPatterns("/test/**/")
                .excludePathPatterns("/users/login"); //로그인 쪽은 예외처리를 한다.
    }
}

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명