필터는 웹 서버의 일부이고, 인터셉터는 Spring MVC의 일부입니다. 필터는 요청이 디스패쳐 서블릿에 도착하기 전에 동작하고, 인터셉터는 디스패쳐 서블릿과 컨트롤러 사이에서 요청을 가로챕니다.
Spring Security 는 대표적인 필터
모든 request의 ip를 로깅하는 인터셉터를 구현해보자
implementation 'org.springframework.boot:spring-boot-starter-web'
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
}
public class LogInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("[preHandle][from " + getIP(request) + "]" + "[" + request.getMethod() + " " + request.getRequestURI() + "]");
return true;
}
private String getIP(HttpServletRequest request) {
String ipFromHeader = request.getHeader("X-FORWARDED-FOR");
if (ipFromHeader != null && ipFromHeader.length() > 0) {
return ipFromHeader;
}
return request.getRemoteAddr();
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("[postHandle][" + response.getStatus() + "]");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("[afterCompletion][" + response.getStatus() + "][exception: " + ex + "]");
}
}
HandlerInterceptor
: Spring MVC 내에 작용하는 인터셉터는 모두 HandlerInterceptor
를 구현해야 함preHandle
: request를 처리하기 직전에 핸들링postHandle
: DispatcherServlet이 뷰를 랜더링하기 직전에 핸들링postHandle
: DispatcherServlet이 뷰를 랜더링 한 이후1에서 생성한 WebConfig
에 아래와 같이 인터셉터를 등록한다
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor());
}
}
필터에도 추가로 로그를 남겨보았다
토큰 인증 성공한 경우
토큰 인증 실패한 경우
HandlerInterceptors vs. Filters in Spring MVC
Introduction to Spring MVC HandlerInterceptor