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

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

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

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

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



답변

에서 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 압축과 같은 콘텐츠 요청 및보기 콘텐츠 처리에 적합합니다. 이것은 일반적으로 필터를 특정 콘텐츠 유형 (예 : 이미지) 또는 모든 요청에 ​​매핑해야하는 경우를 보여줍니다.


답변

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

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


답변

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

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

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


답변