반응형

스프링(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);
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기