반응형
스프링(Spring)에서 Handler의 주요 역할은 유저가 Request 요청을 보낼 때, Request에 해당하는 Controller를 호출하기 전이나 호출한 후에 작업을 할 수 있도록 interceptor가 존재한다. 이 interceptor는 웹에서 권한에 대한 인증이나 SSO 인증을 위해 Controller에 접근 하기 전 Token 체크를 할 수 있으며, 전처리를 할 수 있는 단계이다.
이 interceptor는 servlet.xml에서 설정하여 interceptor에 접근할 수 있다.
아래와 같이, servlet.xml에서 A, B, C, D, E라는 Interceptor를 list에 묶으면 list에 등록되는 순서대로 Controller를 호출하기 전에 interceptor에 먼저 접근한다.
servlet.xml
<beans>
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="Alpha" value="true" />
<property name="interceptors">
<list>
<ref bean="AIntercepter" />
<ref bean="BIntercepter" />
<ref bean="CIntercepter" />
<ref bean="DIntercepter" />
<ref bean="EInterceptor" />
</list>
</property>
</bean>
</beans>
여기서 순서대로, interceptor를 부를 때, HandlerExecutionChain.class에서 순서대로 접근하게 해준다.
HandlerExecutionChain.applyPreHandle()
/**
* Apply preHandle methods of registered interceptors.
* @return {@code true} if the execution chain should proceed with the
* next interceptor or the handler itself. Else, DispatcherServlet assumes
* that this interceptor has already dealt with the response itself.
*/
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(request, response, this.handler)) {
triggerAfterCompletion(request, response, null);
return false;
}
this.interceptorIndex = i;
}
}
return true;
}
위의 코드에서, interceptor를 순서대로 1개씩 가져오고, interceptor의 결과를 HandlerInterceptorAdapter에 따라 true면 계속적으로 interceptor가 진행이 된다.
HandlerExecutionChain.applyPostHandle()
/**
* Apply postHandle methods of registered interceptors.
*/
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, ModelAndView mv) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(request, response, this.handler, mv);
}
}
}
반응형
최근댓글