참새의 이야기
[MVC2] 로그인 처리 - Filter, Interceptor 본문
웹 개발을 하다 보면, 로그인을 한 사용자만이 접근할 수 있는 페이지가 있다.
각 페이지마다 로그인 여부를 따로 확인하면 로그인 로직이 변경될 때마다 수정할 부분이 많아진다.
이런 공통적인 처리는 서블릿 필터나 스프링 인터셉터로 하면 간단해진다.
서블릿 필터
우선 필터는 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러
의 흐름으로 호출된다.
필터에서 사용자가 로그인 되어 있다면 서블릿으로 흐름을 넘기고, 그렇지 않다면 넘기지 않고 끝을 낸다.
필터는 체인으로 구성되므로 체인에 여러 필터를 추가하여 적용할 수 있다.
WebConfig파일을 생성하고 아래와 같이 Bean을 등록하여 사용하는 것이다.
Bean 등록 시에 필터의 순서와 필터를 적용할 URL 패턴을 지정한다.
@Bean
public FilterRegistrationBean logFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
스프링 인터셉터
스프링 인터셉터와 서블릿 필터는 적용 순서와 범위에서 차이가 있다.
필터가 서블릿 전에 적용된다면, 스프링 인터셉터는 dispatcher servlet을 지난 후 컨트롤러 호출 직전에 적용된다.
스프링 인터셉터는 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
의 흐름으로 호출되고, 필터처럼 체인으로 구성된다.
인터셉터 구현
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
위의 HandlerInterceptor를 구현하여 사용할 수 있다.
preHandle로 호출 전, postHandle로 호출 후, afterCompletion으로 요청 완료 후의 동작을 구현할 수 있다.
컨트롤러에서 예외가 발생한 경우 postHandle은 호출되지 않지만 afterCompletion은 호출을 보장한다.
reference
이 글은 김영한님의 '스프링 MVC 2편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC2] MVC 예외 처리 (0) | 2023.08.12 |
---|---|
[MVC2] ArgumentResolver (0) | 2023.08.10 |
[MVC2] 로그인 처리 - Cookie, Session (0) | 2023.08.10 |
[MVC2] Bean Validation (0) | 2023.08.08 |
[MVC2] Validation (2) | 2023.08.08 |