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>
'Java > Spring' 카테고리의 다른 글
스케줄링 사용법, 크론(cron) 표현식 (0) | 2022.06.21 |
---|---|
Spring Legacy Project part 3. (Controller의 Parameter 전달) (0) | 2021.02.28 |
Log4j error (org.apache.log4j.Logger cannot be resolved to a type) (0) | 2021.02.27 |
Spring Legacy Project part 2. (JUnit Test) (0) | 2021.02.26 |
Spring Legacy Project part 1. (Lombok, DI) (0) | 2021.02.24 |