인터셉터란?
- 인터셉터는 URI호출시에 해당 요청의 컨트롤러가 처리 되기 전 또는 후에 작업을 하기 위해서 사용된다.
- 컨트롤러의 URI에 접근하는 과정에서 무언가를 제어할 필요가 있을 때 사용
인터셉터는 필터가 할 수 있는 역할과 비슷한데, 이둘의 차이는 무엇일까?
인터셉터와 필터의 차이
- 필터는
DispatcherServlet
앞에서 동작, 인터셉터는DispatcherServlet
에서HandlerController
로 가기전에 동작한다 - 필터는 서블릿의 기능 중 일부이고, 인터셉터는 스프링 프레임워크에서 제공되는 기능이다.
→ 인터셉터에서는 스프링 빈을 사용할 수 있다.
메서드 및 구현 방법
메서드
preHandler
- 컨트롤러 실행 전 수행한다. 반환 값이 true 일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않는다. ObejctHandler는 진입하려는 컨트롤러 클래스 객체가 담겨있다.postHandle
- 컨트롤러 실행 후 View가 렌더링 되기 전에 수행한다.afterCompletion
- 컨트롤러 실행되고 view가 렌더링 된 후에 실행된다.afterConcurrentHandlingStarted
- 비동기 요청 시PostHandle
과afterCompletion
이 수행되지 않고afterConcurrentHandlingStarted
가 수행된다.
구현 방법
HandlerInterceptorAdapter를 상속받아 구현한다.
- Interceptor 생성
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class HttpInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("[preHandle]");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[postHandle]");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
logger.info("[afterCompletion]");
}
}
- Interceptor 등록
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HttpInterceptor())
.addPathPatterns("/*")
.excludePathPatterns("/board"); // 해당 경로는 인터셉터가 가로채지 않는다.
}
}
- Controller적용
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@GetMapping("/user")
public String user() {
logger.info("user");
return "/user";
}
@GetMapping("/board")
public String board() {
logger.info("board");
return "/board";
}
}
반응형