728x90

Interceptor
spring container가 관리한다. 따라서 스프링의 모든 빈 객체에 접근할 수 있다.
DispatcherServlet에서 Controller를 호출하기 전에 먼저 동작한다.
servlet-context.xml에서 설정한다.
* filter는 Servlet container에서 관리한다. DispatcherServlet 이전에 실행되고, web.xml에서 설정한다.
사용자 인터셉터.java
spring 5.3 이상부터는 extends HandlerInterceptorAdapter 하지 않고 implements HandlerInterceptor한다. HandlerInterceptor 인터페이스를 상속받더라도 필요없는 메서드는 오버라이딩하지 않아도 된다.
| public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | - controller 수행 전 호출 - return true : 다음 interceptor 또는 controller 수행 - return false : request 바로 종료 |
| public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) |
- controller 수행 후 호출 |
| public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | - view를 통해 클라이언트에 응답 전송한 뒤 실행 - 예외가 발생해도 실행됨 - 하지만 view가 만들어지지 않았다면 실행되지 않음 |
public class ___Interceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.debug("preHandle() {} 호출" ,handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
logger.debug("postHandle() {} 종료" ,handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
logger.debug("afterCompletion() {} View 응답" ,handler);
}
}
servlet-context.xml
사용할 인터셉터와 url을 매핑한다.
| mapping | 인터셉터가 동작할 url |
| exclude-mapping | mapping된 url에서 제외할 url |
| bean | 인터셉터 class |
| ref | bean으로 미리 설정한 인터셉터 |
<beans:bean id="인터셉터아이디" class="com.____.interceptor.ConfirmInterceptor" />
<interceptors>
<interceptor>
<mapping path="/**" />
<exclude-mapping path="/_____/**" />
<beans:bean class="com.____.interceptor.LoggingInterceptor" />
<!--<beans:ref bean="인터셉터아이디" /> 도 가능-->
</interceptor>
</interceptors>
Configuration.java
SpringBoot에서처럼 servlet-context.xml을 쓰지 않는 환경에서는 Configuration class를 활용한다. 그 클래스에서 implements WebMvcConfigurer를 받고 public void addInterceptors(InterceptorRegistry registry) 를 오버라이딩하면 된다.
registry에 interceptor를 추가하고, 주소pattern들을 추가한다.
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private 인터셉터클래스 interceptor;
private final List<String> patterns = Arrays.asList("주소", "주소");
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor).addPathPatterns(patterns);
}
}
인터셉터 호출 순서
여러 개의 인터셉터가 있다면 servlet-context에 정의한 순서대로 호출된다.

'기록 > BACKEND' 카테고리의 다른 글
| [Spring] MyBatis 설정(feat.Spring) (0) | 2022.04.26 |
|---|---|
| [WEB] MyBatis 설정 (0) | 2022.04.25 |
| [Spring] File Download (0) | 2022.04.23 |
| [Spring] File Upload (0) | 2022.04.22 |
| [Spring] 예외처리하기 - ControllerAdvice (0) | 2022.04.21 |
댓글