자바(Java)/JAVA 2EE

서블릿 필터(Filter) 설명 및 사용방법

본클라쓰 2010. 9. 5. 21:38

필터(Filter)

 

필터란 서블릿 2.3 버전에 추가된 것으로, 클라이언트의 요청을 서블릿 받기 전에 가로채어 필터에 작성된 내용을 수행하는 것을 말한다. 따라서 필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가적인 기능을 수행시킬 수 있다.

 

 

 

 

 

필터(Filter)의 기능 - 필터로 할 수 있는 것들

  1. 인증(사용자 인증)
  2. 로깅 및 감사 필터
  3. 이미지 변환
  4. 데이터 압축
  5. 암호화 필터
  6. 토크나이징(Tokenizing) 필터
  7. XML 컨텐츠를 변형하는 XSLT 필터
  8. Mime-Type 체인 필터
  9. URL 및 기타 정보들을 캐시하는 필터

 

 

 

 

필터 적용 순서

 

1. 필터 인터페이스를 구현하는 자바 클래스를 생성

2. /WEB-INF/web.xml 에 filter 엘레멘트를 사용하여 필터 클래스를 등록

 

 

 

 

 

필터의 라이프 사이클

 

필터는 서블릿과 비슷한 라이프 사이클을 가지며 생성, 초기화, 필터, 종료의 4단계로 이루어진다. 또한, 서블릿 컨테이너는 필터 객체가 초기화 파라미터에 접근하는데 사용하는 환경설정 객체(FilterConfig)의 레퍼런스를 제공한다.

 

서블릿 컨테이너가 필터의 init() 메소드를 호출하면 필터 인스턴스는 바로 요청을 처리할 수 있는 상태가 된다. 서블릿이 service() 메소드를 이용해서 요청을 처리한 것처럼 필터는 doFilter() 메소드를 통해서 요청을 처리한다. 모든 요청에 대한 처리가 끝나면 destory() 메소드가 호출되면서 필터는 비활성 상태로 변경된다.

 

 

 

 

 

 

필터 클래스

 

필터 클래스는 javax.servlet.Filter 인터페이스를 구현해야 한다. Filter 인터페이스는 init(), doFilter(), destroy() 메소드를 정의 되어있으며, 각각의 메소드의 역할을 다음과 같다.

 

- init(FilterConfig config) : void  throws ServletException

서블릿 컨테이너가 필터 인스턴스를 초기화하기 위해서 호출하는 메소드

 

- doFilter(ServletRequest req, ServletResponse res, FilterChain chain) : void  throws IOException, ServletException

필터의 로직을 작성하는 메소드

 

- destroy() : void

필터 인스턴스를 종료시키기 전에 호출하는 메소드

 

 

 

 

 

필터의 개념도

 

 

위의 그림처럼 필터는 연속적인 작용을 수행한다. 필터 객체가 수행해야 할 부분인 doFilter() 메소드의 인자로 전달되는 것이 FilterChain 객체이다. FilterChain 객체는 동기화를 위해서도 존재하지만, 필터의 수행과정을 연속적으로 하기 위한 방법이다. doFilter() 메소드는 다음처럼 구현되어야 한다.

 

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    

    // 전처리(Preprocessing)

    chain.doFilter(req, res);

    // 후처리(Postprocessing) 

 

위의 개념도에서 보다싶이 필터는 한번만 수행되는 것이 아니다. 요청을 받을 시 수행되고 chain.doFilter()를 통해 다음 부분으로 넘겨준다. 그 다음 모든 부분이 다 수행되면 다시 필터로 완전한 응답 객체와 함께 제어권이 넘어오게 된다. 위의 코드처럼 chain.doFilter() 를 기준으로 전처리 부분과 후처리 부분으로 나누는 이유인 것이다.

 

따라서, chain.doFilter() 메소드가 doFilter() 메소드 안에 없다면 서블릿의 수행결과를 확인 할 수 없는 것이다. 즉, chain.doFilter() 메소드를 사용하여 다음 단계인 서블릿을 수행 한 후 결과를 다시 받는 것이다. 이와 같이 필터의 연속적인 개념을 알아야 필터를 사용하는데 혼돈이 없다.

 

 

 

 

 

web.xml 에 필터 등록 방법

 

1. 등록

<filter>

    <filter-name>Logging Filter</filter-name>

    <filter-class>LogginFilter</filter-class> 

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value> 

    </init-param> 

</filter> 

 

 

2. 요청 매핑

<filter-mapping>

    <filter-name>Logging Filter</filter-name>

    <url-pattern>/*</url-pattern> 

</filter-mapping>