Request가 Controller에 도달하기 전에 intercept 할수 있는 방법은 두가지가 있다.
- Servlet Filter
- 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(...)
- PostHandle(...)
- 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"); //로그인 쪽은 예외처리를 한다.
}
}
|
댓글
댓글 쓰기