BACK_END/Spring 공부
Spring - 인터셉터
harry595
2021. 3. 8. 19:40
스프링 동작 과정
스프링이 동작될때 클라이언트로 부터 요청이 들어오면
필터가 존재하면 필터가 동작하고 디스패처 서블릿이 동작함
디스패처 서블릿은 선처리 작업이 있다면 우선 수행하고 핸들러 매핑을 통해
실제 어떤 핸들러가 동작해야하는지 얻어내고 핸들러가 실행됨
이때 디스패처 서블릿이 핸들러를 수행할때 중간에 핸들러 인터셉터가 있다.
이 요청이 끝나면 뷰의 정보를 디스패처 서블릿에 넘기고 뷰 resolver를 이용해서
view의 정보를 얻어오고 해당 view를 찾아 응답함
인터셉터란?
디스패처 서블릿에서 핸들러(컨트롤러)로 요청을 보낼때,
핸들러에서 디스패처 서블릿으로 응답을 보낼 때 동작
인터셉터 작성법
- org.springframework.web.servlet.HandlerInterceptor 인터페이스 구현
- org.springframework.web.servlet.handler.HandlerInterceptorAdaptor 클래스 상속
- Java Config를 사용한다면, WebMvcConfigurerAdapter가 가지고 있는
addInterceptors 메소드를 오버라이딩하고 등록하는 과정을 거침
- XML 설정을 사용한다면, <mvc:interceptors> 요소에 인터셉터 등록
사용법
LogInterceptor.java
package kr.or.connect.guestbook.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LogInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(handler.toString() + " 가 종료되었습니다. " + modelAndView.getViewName() + "을 view로 사용합니다.");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(handler.toString() + " 를 호출했습니다.");
return true;
}
WebMvcContextConfiguration.java (추가)
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor());
}