Spring MVC에서 인터셉터와 필터의 차이점


108

나는 조금에 대해 혼란 스러워요 FilterInterceptor목적.

내가 문서에서 이해했듯이 Interceptor요청 사이에 실행됩니다. 반면에 Filter뷰를 렌더링하기 전에 실행되지만 컨트롤러가 응답을 렌더링 한 후에 실행됩니다.

그렇다면 postHandle()인터셉터와 doFilter()필터 의 차이점은 무엇입니까?

봄 MVC sheme 사용해야하는 사용 사례에 대한 모범 사례는 무엇입니까? 이 그림에서 작품 FilterInterceptors는 어디입니까?

답변:


87

에서 HandlerIntercepter자바 독 :

HandlerInterceptor기본적으로 Servlet과 유사 Filter하지만 후자와 달리 핸들러 자체의 실행을 금지하는 옵션과 사용자 정의 후 처리를 허용하는 사용자 정의 전처리 만 허용합니다. 필터는 더 강력합니다. 예를 들어 체인을 통해 전달되는 요청 및 응답 객체를 교환 할 수 있습니다. 필터는 응용 프로그램 컨텍스트의 web.xml, a HandlerInterceptor에서 구성됩니다 .

기본 지침으로, 세분화 된 핸들러 관련 사전 처리 작업은 HandlerInterceptor구현 후보이며 , 특히 팩토 아웃 된 공통 핸들러 코드 및 권한 부여 검사입니다. 반면에 a Filter는 멀티 파트 양식 및 GZIP 압축과 같은 콘텐츠 요청 및보기 콘텐츠 처리에 적합합니다. 이것은 일반적으로 필터를 특정 콘텐츠 유형 (예 : 이미지) 또는 모든 요청에 ​​매핑해야하는 경우를 보여줍니다.

그 말로 :

어디 사이의 차이 Interceptor#postHandle()와는 Filter#doFilter()?

postHandle핸들러 메소드 호출 후 뷰가 렌더링되기 전에 호출됩니다. 따라서 뷰에 더 많은 모델 객체를 추가 할 수 있지만 이미 커밋되었으므로 변경할 수 없습니다HttpServletResponse .

doFilter훨씬 더 다용도보다 postHandle. 요청 또는 응답을 변경하여 체인에 전달하거나 요청 처리를 차단할 수도 있습니다.

또한 preHandlepostHandle메서드 HandlerMethod에서 요청을 처리 한에 액세스 할 수 있습니다 . 따라서 핸들러 자체를 기반으로 전 / 후 처리 로직을 추가 할 수 있습니다. 예를 들어, 일부 어노테이션이있는 핸들러 메소드에 대한 로직을 추가 할 수 있습니다.

사용해야하는 사용 사례에 대한 모범 사례는 무엇입니까?

문서에서 말했듯이 세분화 된 핸들러 관련 사전 처리 작업은 HandlerInterceptor구현 후보이며 , 특히 팩토링 된 공통 핸들러 코드 및 권한 검사입니다. 반면에 a Filter는 멀티 파트 양식 및 GZIP 압축과 같은 콘텐츠 요청 및보기 콘텐츠 처리에 적합합니다. 이것은 일반적으로 필터를 특정 콘텐츠 유형 (예 : 이미지) 또는 모든 요청에 ​​매핑해야하는 경우를 보여줍니다.


필터는 애플리케이션 컨텍스트의 HandlerInterceptor 인 web.xml에서 구성됩니다. 설명 할 수 있습니까?

4
필터 는 Servlet API와 관련 HandlerIntercepter이 있으며 Spring 특정 개념입니다. 서블릿 필터를 등록하려면 이전 web.xml(Servlet 2.5 및 이전 버전) 또는 새로운 프로그래밍 방식 (Servlet 3+)을 사용하여 등록 할 수 있습니다 . (가)부터 HandlerIntercepter단지 봄 추상화, 당신은 봄의 컨텍스트에 등록해야합니다
알리 Dehghani에게

필터는 Servlet API와 관련이 있으며 HandlerIntercepter는 Spring 특정 개념입니다. 코렉! 그러나 web.xml로 등록하는 것이 무엇이든 WebApplication디스패처 당 단일이므로 서블릿과 필터는 모두 컨텍스트와 관련되어 rootContext있으므로 인터셉터와 필터를 연결하는 것이 좋습니다. 따라서 여러 디스패처가 모두 동일하게 공유 할 수 있습니다.

9

필터 :-이름에서 알 수 있듯이 필터는 각 수신 HTTP 요청 및 각 http 응답에 대해 서블릿 컨테이너가 실행하는 Java 클래스입니다. 이렇게하면 JSP 페이지, 서블릿 또는 단순 정적 페이지와 같은 HTTP 수신 요청이 리소스에 도달하기 전에 관리 할 수 ​​있습니다. 같은 방식으로 리소스 실행 후 HTTP 아웃 바운드 응답을 관리 할 수 ​​있습니다.

Interceptor :-Spring Interceptor는 Servlet Filters와 비슷하지만 Spring Context에서 동작하므로 HTTP Request 및 Response 관리에 강력하지만 모든 Spring 컨텍스트에 접근 할 수 있기 때문에보다 정교한 동작을 구현할 수 있습니다.


2
출처 : mkjava.com/tutorial/filter-vs-interceptor 소스 언급해야
Premraj

Spring 보안 필터는 어떻습니까? 스프링 컨텍스트도 제공합니다.
Lovin

6

HandlerInterceptor는 실제 대상 "핸들러"에 액세스 할 수 있기 때문에 필터보다 더 세밀한 제어를 제공합니다. 즉, 수행하는 작업은 요청이 실제로 수행하는 작업에 따라 달라질 수 있습니다 (서블릿 필터는 일반적으로 적용됨). 모든 요청에 ​​대해-각 요청의 매개 변수 만 고려할 수 있음). handlerInterceptor는 또한 3 가지 다른 메소드를 제공하므로 핸들러를 호출하기 전, 핸들러가 완료되었지만 뷰 렌더링 이전 (뷰 렌더링을 완전히 우회 할 수도 있음) 또는 뷰 자체가 렌더링 된 후에 동작을 적용 할 수 있습니다. 또한 서로 다른 핸들러 그룹에 대해 서로 다른 인터셉터를 설정할 수 있습니다. 인터셉터는 handlerMapping에서 구성되며 여러 handlerMapping이있을 수 있습니다.

따라서 완전히 일반적인 작업 (예 : 모든 요청 기록)을 수행해야하는 경우 필터로 충분하지만 동작이 대상 처리기에 따라 달라 지거나 요청 처리와보기 렌더링 사이에 작업을 수행하려는 경우 HandlerInterceptor는 이러한 유연성을 제공합니다.

참조 : http://static.springframework.org/sp...ng-interceptor


2
링크가 끊어졌습니다.
Jason Law
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.