필터를 구현 하고 나서 스프링 MVC에서 사용되는 인터셉터에 대해서 배웠고, 인터셉트를 구현하는 걸 정리해 봤당,,,!!
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
public class LogInterceptor implements HandlerInterceptor {
public static final String LOG_ID = "logId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
// 추후 afterCompletion에서 사용 할 수 있게
// uuid를 request에 set함.
request.setAttribute(LOG_ID, uuid);
// HandlerMethod를 이용해서 어떤 컨트롤러가 호출 되는지 확인 가능
if (handler instanceof HandlerMethod) {
// HanderlerMethod에는 호출할 컨트롤러 메서드의 모든 정보가 들어있음.
HandlerMethod hm = (HandlerMethod) handler;
}
log.info("REQUEST [{}][{}][{}]", uuid, uri, handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String uri = request.getRequestURI();
String logId = (String) request.getAttribute(LOG_ID);
log.info("RESPONSE [{}][{}][{}]", logId, uri, handler);
if (ex != null) {
log.info("Exception :: {}",ex);
}
}
}
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("인증 체크 인터셉터 실행 {}", requestURI);
HttpSession session = request.getSession();
if (session == null || request.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청");
response.sendRedirect("/login?redirectURL=" + requestURI);
return false;
}
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/*.icon", "/error");
registry.addInterceptor(new LoginCheckInterceptor())
.order(2)
.addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/logout", "/members/add", "/css/**", "/*.ico", "/error");
}
필터보다 스프링 MVC에서 제공하는 인터셉터를 사용해서 보다 세세하게 설정하고 제어하자!