Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

[MVC2] 로그인 처리 - Filter, Interceptor 본문

Spring

[MVC2] 로그인 처리 - Filter, Interceptor

참새짹짹! 2023. 8. 10. 13:08

웹 개발을 하다 보면, 로그인을 한 사용자만이 접근할 수 있는 페이지가 있다.

각 페이지마다 로그인 여부를 따로 확인하면 로그인 로직이 변경될 때마다 수정할 부분이 많아진다.

이런 공통적인 처리는 서블릿 필터나 스프링 인터셉터로 하면 간단해진다.

서블릿 필터

우선 필터는 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