Spring 3 에서 컨트롤러 메서드(Controller Method) 진입시 어노테이션(Annotation)을 활용한 인터셉터(Interceptor) 만들기

By | 10월 29, 2014

 
1. 어노테이션 인터페이스 작성

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE, ElementType.METHOD}) //클래스 혹은 메서드에 어노테이션 적용
public @interface SslCheck {
	boolean isBlock() default false; //어노테이션에 인수를 입력받아 활용하고 싶을 경우 메서드 정의
}

 
 
2. HandlerInterceptorAdapter를 상속받은 인터셉터 클래스를 작성하면서 어노테이션을 활용

public class SslCheckInterceptor extends HandlerInterceptorAdapter {
    //주로 preHandle()에 로직을 작성할 것이다.
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		HandlerMethod handlerMethod = (HandlerMethod) handler;
        //현재 호출된 핸들러 메서드에 해당 어노테이션이 존재하는지 체크
		SslCheck sslCheckAnnotation = handlerMethod.getMethodAnnotation(SslCheck.class);
        //현재 호출된 핸들러 클래스에 해당 어노테이션이 존재하는지 체크
		sslCheckAnnotation = (sslCheckAnnotation == null) ? handlerMethod.getBeanType().getAnnotation(SslCheck.class) : sslCheckAnnotation;
		/*
		 * 아래 조건에 해당할 경우 이 Interceptor를 실행하지 않고 SKIP한다.
		 */
		if(sslCheckAnnotation == null){ /* 메서드에도, 클래스에도 어노테이션이 없을 경우 */
			return super.preHandle(request, response, handlerMethod); /* 바이패스 */
		}
		/*
		 * 어노테이션 사용시 괄호 안에 인수로 입력한 값을 활용하는 예시 (예: @SslCheck(isBlock = true))
		 */
		if(sslCheckAnnotation.isBlock()){
            response.sendRedirect("http://google.com"); //리디렉션
            return false; //preHandle()에서 false를 리턴하면 DispatcherServlet은 Interceptor가 알아서 response를 처리했다고 간주한다.
		}
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
	}
}

 
 
 3. controller.xml 에  Interceptor bean을 선언하고 Interceptor chain에 등록
(controller.xml 은 DispatcherServlet의 init-param 에 contextConfigLocation 이라는 이름으로 삽입되는 파일명이다.)

<bean id="sslCheckInterceptor" class="common.interceptor.SslCheckInterceptor" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
	<property name="useSuffixPatternMatch" value="true" />
	<property name="alwaysUseFullPath" value="true" />
	<property name="order" value="1" />
	<property name="interceptors">
		<list>
			<ref bean="controllerLogger"/>
			<ref bean="sslCheckInterceptor"/>
		</list>
	</property>
</bean>

 
 
 

Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
ㄱㅁㅈ
ㄱㅁㅈ
7 years ago

딱 찾던 글이었습니다. 감사합니다.

itpsolver
itpsolver
7 years ago
Reply to  ㄱㅁㅈ

도움이 됐다니 좋네요~^^