Spring Interceptor vs Filter 차단기 와 필터 의 차이

머리말
Spring 의 interceptor 와 filter 를 소개 하 는 글 을 전재 합 니 다.http://einverne.github.io/post/2017/08/spring-interceptor-vs-filter.html。
이 글 은 말 을 잘 하 는 것 같 아서 깊이 이해 하고 분석 해 야 한다.
본문
Spring Interceptor vs Filter 차단기 와 필터 의 차이 
Posted on 08/14/2017 by Ein Verne | View revision history
Spring 의 Interceptor (차단기) 는 Servlet 의 Filter 와 비슷 한 점 이 있어 권한 검사, 로그 기록 등 을 실현 할 수 있다.다른 것 은:
Filter
Interceptor
Summary
Filter 인 터 페 이 스 는 javax. servlet 패키지 에 정의 되 어 있 습 니 다.
인터페이스 Handler Interceptor 는 org. springframework. web. servlet 패키지 에 정 의 됩 니 다.
 
Filter 정 의 는 웹. xml 에 있 습 니 다.
 
 
Filter 는 Servlet 전후 에 만 작 동 합 니 다.Filters 는 보통 요청 과 응답 (request / response) 을 블랙박스 로 하고 Filter 는 servlet 의 실현 을 고려 하지 않 습 니 다.
차단 기 는 방법 전후, 이상 투 출 전후 등 으로 깊이 들 어 갈 수 있 기 때문에 차단기 의 사용 은 더욱 탄력 이 있다.사용자 가 (hook into) 요청 의 수명 주기 에 개입 할 수 있 도록 요청 과정 에서 정 보 를 얻 을 수 있 습 니 다. Interceptor 는 보통 요청 과 더욱 결합 합 니 다.
Spring 프레임 워 크 프로그램 에 서 는 차단 기 를 우선 사용 해 야 합 니 다.거의 모든 Filter 가 할 수 있 는 일, interceptor 가 쉽게 이 루어 집 니 다.
Filter 는 Servlet 규범 에 규정된 것 이다.
차단 기 는 웹 프로그램 뿐만 아니 라 애플 리 케 이 션, 스윙 프로그램 에 도 사용 할 수 있다.
사용 범위 가 다르다
Filter 는 Servlet 규범 에서 정 의 된 것 으로 Servlet 용기 가 지원 합 니 다.
차단 기 는 Spring 용기 안에 있 고 Spring 프레임 워 크 가 지원 합 니 다.
규범 이 다르다
Filter 는 Spring 용기 자원 을 사용 할 수 없습니다.
차단 기 는 Spring 의 구성 요소 로 Spring 관리 로 Spring 파일 에 설정 되 어 있 기 때문에 Spring 의 모든 자원, 대상 을 사용 할 수 있 습 니 다. 예 를 들 어 Service 대상, 데이터 소스, 사무 관리 등 은 IoC 를 통 해 차단기 에 주입 하면 됩 니 다.
Spring 에 서 는 interceptor 를 사용 하 는 것 이 더 쉽다.
Filter 는 Server (like Tomcat) 에서 호출 됩 니 다.
Interceptor 는 Spring 에 의 해 호출 되 었 습 니 다.
따라서 Filter 는 항상 Interceptor 보다 우선 합 니 다.
interceptor 사용
interceptor 의 실행 순 서 는 다음 과 같 습 니 다.
  • Dispatcher Servlet 도착 요청
  • Dispatcher Servlet 을 Interceptor 에 보 내 고 preHandle
  • 을 실행 합 니 다.
  • 컨트롤 러 요청
  • 요청 완료 후 postHandle 실행
  • Spring 에 서 는 주로 Handler Interceptor 인 터 페 이 스 를 통 해 요청 의 차단 을 실현 하고 Handler Interceptor 인 터 페 이 스 를 실현 하려 면 다음 세 가지 방법 이 필요 합 니 다.
  • preHandle() – handler 가 실행 되 기 전에 boolean 값 을 되 돌려 줍 니 다. true 는 계속 실행 하고 false 는 실행 을 중단 하고 되 돌려 줍 니 다.
  • postHandle() – handler 가 실 행 된 후 돌아 오기 전에 돌아 온 결 과 를 수정 할 수 있 습 니 다
  • afterCompletion() – 요청 이 완전히 끝 난 후에 호출 하면 요청 시간 등 을 통계 할 수 있 습 니 다
  • 통계 요청 시간 소모
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{
    
    	private static final Logger logger = Logger.getLogger(ExecuteTimeInterceptor.class);
    
    	//before the actual handler will be executed
    	public boolean preHandle(HttpServletRequest request,
    		HttpServletResponse response, Object handler)
    		throws Exception {
    
    		long startTime = System.currentTimeMillis();
    		request.setAttribute("startTime", startTime);
    
    		return true;
    	}
    
    	//after the handler is executed
    	public void postHandle(
    		HttpServletRequest request, HttpServletResponse response,
    		Object handler, ModelAndView modelAndView)
    		throws Exception {
    
    		long startTime = (Long)request.getAttribute("startTime");
    
    		long endTime = System.currentTimeMillis();
    
    		long executeTime = endTime - startTime;
    
    		//modified the exisitng modelAndView
    		modelAndView.addObject("executeTime",executeTime);
    
    		//log it
    		if(logger.isDebugEnabled()){
    		   logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
    		}
    	}
    }

    예시 원본 mkyong
    화면 음악: interceptors 탭 을 사용 하여 SpringMVC 차단기 체인 에 가입 해 야 하 는 차단 기 를 설명 합 니 다.
      
      
      
    	  
    		   
    		   
    		   
    	  
    	  
    		   
    		   
    	  
      

    화면 음악: interceptors 라벨 을 이용 하여 일련의 차단 기 를 설명 한 다음 에 차단기 체인 을 형성 할 수 있 습 니 다. 차단기 의 실행 순 서 는 성명 의 선착순 으로 실 행 됩 니 다. 먼저 설명 한 차단기 중의 preHandle 방법 은 먼저 실 행 됩 니 다. 그러나 post Handle 방법 과 after Complete 방법 은 나중에 실 행 됩 니 다.
    화면 음악 c: interceptors 태그 에서 interceptor 는 주로 두 가지 방식 이 있 습 니 다.
  • Interceptor 구현 클래스 의 bean 대상 을 직접 정의 합 니 다.이러한 방식 으로 설명 하 는 Interceptor 차단 기 는 모든 요청 을 차단 합 니 다.
  • mvc: interceptor 라벨 을 사용 하여 설명 합 니 다.이러한 방식 으로 설명 하 는 Interceptor 는 화면 음악: mapping 하위 탭 을 통 해 차단 해 야 할 요청 경 로 를 정의 할 수 있 습 니 다.

  • 상기 두 단 계 를 거 친 후에 정 의 된 차단기 가 작용 하여 특정한 요청 을 차단 할 것 이다.
    필터 사용
    Servlet 의 Filter 인 터 페 이 스 는 다음 과 같은 방법 이 필요 합 니 다.
  • void init(FilterConfig paramFilterConfig)  – 용기 가 Filter 를 초기 화 할 때 호출 됩 니 다. 이 방법 은 Filter 의 수명 주기 에 한 번 만 호출 됩 니 다. 일반적으로 이 방법 에서 일부 자원 을 초기 화 합 니 다. Filter Config 는 용기 가 Filter 에 제공 하 는 초기 화 매개 변수 입 니 다. 이 방법 에서 ServletException 을 던 질 수 있 습 니 다.init 방법 은 성공 적 으로 실행 되 어야 합 니 다. 그렇지 않 으 면 Filter 가 작 동 하지 않 을 수 있 습 니 다. 다음 두 가지 상황 이 발생 했 을 때 웹 용기 에서 Filter 는 유효 하지 않 을 수 있 습 니 다. 1) ServletException 2 를 던 져 웹 용기 가 정의 한 실행 시간 을 초과 할 수 있 습 니 다.
  • doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain)  – 웹 용 기 는 요청 할 때마다 이 방법 을 호출 합 니 다.이 방법 은 용기 의 요청 과 응답 을 매개 변수 로 전달 하고 FilterChain 은 다음 Filter 를 호출 합 니 다.
  • void destroy()  – 용기 가 Filter 인 스 턴 스 를 없 앨 때 이 방법 을 사용 하면 방법 에서 자원 을 없 앨 수 있 습 니 다. 이 방법 은 Filter 의 수명 주기 에 한 번 만 호출 됩 니 다.FrequencyLimitFilter com.company.filter.FrequencyLimitFilter FrequencyLimitFilter /login/*

  • Filter 와 Interceptor 의 용도
  • Authentication Filters
  • Logging and Auditing Filters
  • Image conversion Filters
  • Data compression Filters
  • Encryption Filters
  • Tokenizing Filters
  • Filters that trigger resource access events
  • XSL/T filters
  • Mime-type chain Filter

  • Request Filters 가능:
  • 안전 검 사 를 수행 하고 보안 검 사 를 수행 합 니 다
  • 포맷 요청 헤더 와 주체 reformat request headers or bodies
  • 로그 감사 또는 로그 요청 을 심사 하거나 기록 합 니 다
  • 요청 내용 에 따라 권한 을 부여 하거나 사용자 의 방문 을 제한 합 니 다. Authentication - Blocking requests based on user idenity.
  • 요청 주파수 에 따라 사용자 접근 제한
  • Response Filters 가능:
  • 응답 내용 을 압축 합 니 다. 예 를 들 어 다운로드 한 내용 을 더 작 게 합 니 다. Compress the response stream
  • 응답 append 를 추가 하거나 수정 하거나 response stream 을 변경 합 니 다
  • 생 성 또는 전체 수정 응답 create a different response altogether
  • 지역 에 따라 응답 내용 을 수정 합 니 다. Localization - Targeting 특정 로 케 일 에 대한 요청 과 응답.
  • reference
  • https://gopalakrishnadurga.wordpress.com/2012/06/08/filter-vs-interceptor/

  • https://stackoverflow.com/a/8006315/1820217 ↩
    개인
    그리고 몇 편의 댓 글 을 참고 할 수 있 습 니 다.
    1. https://www.baeldung.com/jersey-filters-interceptors이 사이트 의 내용 은 모두 매우 좋다.
    개인의 일부 인지, interceptor 의 개념 은 struts 가 도입 한 것 같 았 고 나중에 Spring 은 struts 를 참고 하여 스스로 이 기능 을 실현 했다.

    좋은 웹페이지 즐겨찾기