답변:
에서 HandlerIntercepter
의 자바 독 :
HandlerInterceptor
기본적으로 Servlet과 유사Filter
하지만 후자와 달리 핸들러 자체의 실행을 금지하는 옵션과 사용자 정의 후 처리를 허용하는 사용자 정의 전처리 만 허용합니다. 필터는 더 강력합니다. 예를 들어 체인을 통해 전달되는 요청 및 응답 객체를 교환 할 수 있습니다. 필터는 응용 프로그램 컨텍스트의web.xml
, aHandlerInterceptor
에서 구성됩니다 .기본 지침으로, 세분화 된 핸들러 관련 사전 처리 작업은
HandlerInterceptor
구현 후보이며 , 특히 팩토 아웃 된 공통 핸들러 코드 및 권한 부여 검사입니다. 반면에 aFilter
는 멀티 파트 양식 및 GZIP 압축과 같은 콘텐츠 요청 및보기 콘텐츠 처리에 적합합니다. 이것은 일반적으로 필터를 특정 콘텐츠 유형 (예 : 이미지) 또는 모든 요청에 매핑해야하는 경우를 보여줍니다.
그 말로 :
어디 사이의 차이
Interceptor#postHandle()
와는Filter#doFilter()
?
postHandle
핸들러 메소드 호출 후 뷰가 렌더링되기 전에 호출됩니다. 따라서 뷰에 더 많은 모델 객체를 추가 할 수 있지만 이미 커밋되었으므로 변경할 수 없습니다HttpServletResponse
.
doFilter
훨씬 더 다용도보다 postHandle
. 요청 또는 응답을 변경하여 체인에 전달하거나 요청 처리를 차단할 수도 있습니다.
또한 preHandle
및 postHandle
메서드 HandlerMethod
에서 요청을 처리 한에 액세스 할 수 있습니다 . 따라서 핸들러 자체를 기반으로 전 / 후 처리 로직을 추가 할 수 있습니다. 예를 들어, 일부 어노테이션이있는 핸들러 메소드에 대한 로직을 추가 할 수 있습니다.
사용해야하는 사용 사례에 대한 모범 사례는 무엇입니까?
문서에서 말했듯이 세분화 된 핸들러 관련 사전 처리 작업은 HandlerInterceptor
구현 후보이며 , 특히 팩토링 된 공통 핸들러 코드 및 권한 검사입니다. 반면에 a Filter
는 멀티 파트 양식 및 GZIP 압축과 같은 콘텐츠 요청 및보기 콘텐츠 처리에 적합합니다. 이것은 일반적으로 필터를 특정 콘텐츠 유형 (예 : 이미지) 또는 모든 요청에 매핑해야하는 경우를 보여줍니다.
HandlerIntercepter
이 있으며 Spring 특정 개념입니다. 서블릿 필터를 등록하려면 이전 web.xml
(Servlet 2.5 및 이전 버전) 또는 새로운 프로그래밍 방식 (Servlet 3+)을 사용하여 등록 할 수 있습니다 . (가)부터 HandlerIntercepter
단지 봄 추상화, 당신은 봄의 컨텍스트에 등록해야합니다
필터 :-이름에서 알 수 있듯이 필터는 각 수신 HTTP 요청 및 각 http 응답에 대해 서블릿 컨테이너가 실행하는 Java 클래스입니다. 이렇게하면 JSP 페이지, 서블릿 또는 단순 정적 페이지와 같은 HTTP 수신 요청이 리소스에 도달하기 전에 관리 할 수 있습니다. 같은 방식으로 리소스 실행 후 HTTP 아웃 바운드 응답을 관리 할 수 있습니다.
Interceptor :-Spring Interceptor는 Servlet Filters와 비슷하지만 Spring Context에서 동작하므로 HTTP Request 및 Response 관리에 강력하지만 모든 Spring 컨텍스트에 접근 할 수 있기 때문에보다 정교한 동작을 구현할 수 있습니다.
HandlerInterceptor는 실제 대상 "핸들러"에 액세스 할 수 있기 때문에 필터보다 더 세밀한 제어를 제공합니다. 즉, 수행하는 작업은 요청이 실제로 수행하는 작업에 따라 달라질 수 있습니다 (서블릿 필터는 일반적으로 적용됨). 모든 요청에 대해-각 요청의 매개 변수 만 고려할 수 있음). handlerInterceptor는 또한 3 가지 다른 메소드를 제공하므로 핸들러를 호출하기 전, 핸들러가 완료되었지만 뷰 렌더링 이전 (뷰 렌더링을 완전히 우회 할 수도 있음) 또는 뷰 자체가 렌더링 된 후에 동작을 적용 할 수 있습니다. 또한 서로 다른 핸들러 그룹에 대해 서로 다른 인터셉터를 설정할 수 있습니다. 인터셉터는 handlerMapping에서 구성되며 여러 handlerMapping이있을 수 있습니다.
따라서 완전히 일반적인 작업 (예 : 모든 요청 기록)을 수행해야하는 경우 필터로 충분하지만 동작이 대상 처리기에 따라 달라 지거나 요청 처리와보기 렌더링 사이에 작업을 수행하려는 경우 HandlerInterceptor는 이러한 유연성을 제공합니다.