ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HandlerInterceptor (서블릿 필터 비교)
    SPRING/스프링 MVC 2021. 6. 15. 00:48

    HandlerInterceptor 

    - 핸들러 맵핑에 설정할 수 있는 인터셉터 

    - 핸들러를 실행하기 전, 후(아직 랜더링 전) 그리고 완료(랜더링까지 끝난 이후) 시점에 부가 작업을 하고 싶은 경우에 사용할 수 있다. 

    - 여러 핸들러에서 반복적으로 사용하는 코드를 줄이고 싶을 때 사용할 수 있다. 

       (로깅, 인증 체크, Locale 변경 등)

     

    boolean preHandle(request, response, handler

    - 핸들러 실행하기 전에 호출 됨 

    - “핸들러"에 대한 정보를 사용할 수 있기 때문에 서블릿 필터에 비해 보다 세밀한 로직을 구현할 수 있다. 

    - 리턴값으로 계속 다음 인터셉터 또는 핸들러로 요청,응답을 전달할지(true) 응답 처리가 이곳에서 끝났는지(false) 알림.

     

    void postHandle(request, response, modelAndView

    - 핸들러 실행이 끝나고 아직 뷰를 랜더링 하기 이전에 호출 됨 

    - “뷰"에 전달할 추가적이거나 여러 핸들러에 공통적인 모델 정보를 담는데 사용할 수도 있다. 

    - 이 메소드는 인터셉터 역순으로 호출된다. 

    - 비동기적인 요청 처리 시에는 호출되지 않는다. 

     

    void afterCompletion(request, response, handler, ex) 

    - 요청 처리가 완전히 끝난 뒤(뷰 랜더링 끝난 뒤)에 호출 됨 

    - preHandler에서 true를 리턴한 경우에만 호출 됨 

    - 이 메소드는 인터셉터 역순으로 호출된다. 

    - 비동기적인 요청 처리 시에는 호출되지 않는다. 

     

    소스 예시

     

    public class GreetingInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle 1");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle 1");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion 1");
        }
    }
    
    
    public class AnotherInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle 2");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle 2");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion 2");
        }
    }
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            
            // Interceptor 등록
            // addPathPatterns : 해당 URL패턴에서만 인터셉터를 호출한다.
            // order : 우선순위 숫자가 낮을수록 우선순위가 더 높다.
            registry.addInterceptor(new GreetingInterceptor());
            
            registry.addInterceptor(new AnotherInterceptor())
            .addPathPatterns("/hi/**")
            .order(1);
        }
    }
    

     

    인터셉터 순서

     

    vs 서블릿 필터 

    - 서블릿 보다 구체적인 처리가 가능하다. 

    - 서블릿은 보다 일반적인 용도의 기능을 구현하는데 사용하는게 좋다. 

     

     

    인터셉터 주 사용 용도 : 세션 및 쿠키 체크하는 HTTP Protocol 단위 업무, 로그인 세션 체크 

    서블릿 필터 주 사용 용도 : 인증, 이미지 변환, 데이터 압축, 암호화필터, 토크나이징 필터, 인코딩, URL 및 기타 정보를 캐시하는 필터

     

     

     

    'SPRING > 스프링 MVC' 카테고리의 다른 글

    HTTP 메시지 컨버터 : 개요  (0) 2021.06.18
    Resource Handler  (0) 2021.06.16
    Formatter 추가하기  (0) 2021.06.14
    스프링 부트에서 JSP 사용하기  (0) 2021.06.13
    SPRING MVC 설정 관련 정리  (0) 2021.06.11
Designed by Tistory.