본문 바로가기
Java/Spring

[Spring] Spring MVC Interceptor

by HoneyIT 2024. 6. 24.

1. Spring MVC Interceptor란?

- 핸들러(Handler) 호출 시점에 따라 요청을 처리하는 필터(로그인, 권한 등에 사용)

 

2. Spring MVC Hanler 동작 이해하기

- HandlerMapping의 목적은 URL핸들러 메소드와 URL을 연결시키는데에 있다. 즉, DispatcherServlet은 처리를 반환할 때 해당 메소드를 잘생시킬 수 있어야 합니다.

- DispatcherServlet은 메소드를 발생시키기 위해 HandlerAdapter를 사용한다. 한마디로 인터셉터는 반환을 가로채서 처리하며 로그나 권한 체크와 같은 반복적인 핸들러 코드를 피하는 것에 도움을 줍니다.

 

3. Maven Dependencies

- 인터셉터를 사용하기 위해선 pom.xml에 spring-web 의존성을 주입해야 합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.3.13</version>
</dependency>

 

4. Spring Handler Interceptor

- 스프링 인터셉터는 HandlerInterceptorAdapter 클래스 또는 HandlerInterceptor 인터페이스를 할당받는 implements를 포함하는 클래스입니다.

- HandlerInterceptor의 세가지 메인 메소드

  • preHandle() : 실제 핸들러(Controller)가 실행되기 전에 호출
  • postHandle() : 핸들러가 실행되고 view 생성 전에 호출
  • afterCompletion() : 요청이 완료되고 view가 생성된 후에 호출

 

5. Custom Logger Interceptor

- 로그용 인터셉터 클래스를 생성하여 아래와 같이 사용할 수 있습니다.

[Custom Logger Interceptor class 생성]

public class LoggerInterceptor implements HandlerInterceptor {
    ...
}

 

private static Logger log = LoggerFactory.getLogger(LoggerInterceptor.class);

 

 

6. Interceptor 구현

- HandlerIntreceptorAdapter를 상속받아 아래와 같이 CustomInterceptor를 구현할 수 있습니다.

- include-mapping을 통해 포함되는 url에 따라 처리도 가능합니다.

public class CustomInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
	}
	
}

 

- servlet-context.xml(dispatcher-servlet.xml) 파일에 bean 등록해줍니다.

<interceptors>
       <interceptor>
           <mapping path="/**"/>
           <include-mapping path="/login"/>
               <beans:bean class="[클래스 위치]"/>
    </interceptor>
</interceptors>

 

 

 

참조: https://www.baeldung.com/spring-mvc-handlerinterceptor