필터(filter)란 글자 그대로 여과기 역할을 하는 프로그램 이다.

여러 웹 컴포넌트에 대해 똑같은사전작업이나 사후작업을 해야할 경우에 사용한다.

ex 로그인 여부 체크

이 프로그램은 자바 클래스 형태로 구현한다. 이 클래스를 필터 클래스 라고 한다.


필터클래스를 작성할 때는 서블릿 규격서에 정해져 있는 규칙을 지켜서 작성해야 한다.

가장 중요한 규칙은 javax.servlet.Filter 인터페이스를 구현해야 한다.


Filter 인터페이스에는 3개의 메서드가 있다.

doFilter() - 웹브라우저가 컨테이너로 요청을 보냈을 때 호출되는 메서드

사전작업과 사후작업을 이 안에 구현해야 한다.

init(),destory() - 서블릿클래스의 init과destory와 같은역할


doFilter()메서드 작성방법

모든 필터 클래스에는 공통적으로 기술해야 하는 명령문이 있다.

웹 컴포넌트를 호출하는 명령문이다. 이 명령문은 doFilter 메서드의 파라미터를 이용해서 만든다.

doFilter메서드에는 세개의 파라미터가 있다. 이 파라미터들의 값은 모두 웹 컨테이너가 필터로 넘겨주는것이다.

ServletRequest request, ServletResponse response 이 파라미터는 요청객체와 응답 객체이다.

필터가 없다면 이 두 객체는 웹 컨테이너가 웹 컴포넌트로 직접 넘겨줬겠지만 필터가 존재하면 

이 메서드로 전달된다.


세번째 파라미터는 FilterChain chain 이다 이 파라미터는 웹 컴포넌트 호출시에 가장 중요하다.

하나의 웹 컴포넌트에 대해 여러개의 필터가 실행될수 있다. 

정해놓은 순서에 따라 첫번째 필터가 두번째 필터를 호출하고 두번째 필터가 세번째 필터를 호출하고

세번째 필터는 웹 컴포넌트를 호출하는 식으로 진행되어 브라우저로 응답이 도달한다. 이것을 필터 체인이라고 한다.

웹 컨테이너는 필터가 실행되기 전에 필터 체인에 대한 정보를 수집해서 FilterChain객체로 만든 다음

doFilter메서드로 전달한다. 이객체는 필터 체인의 다음번 멤버를 호출할 때 필요하다.


1
2
3
4
5
6
7
8
9
10
public void doFilter
    (ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException 
{
    System.out.println("사전작업 기술");
    request.setCharacterEncoding("euc-kr");//한글인코딩 필터에서 처리
    chain.doFilter(request, response);
    System.out.println("사후작업 기술");
}
 
cs
 

필터클래스 작성 후에는 web.xml 파일에 등록해야한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<web-app>
    <filter><!--필터 등록 엘리먼트  -->
        <filter-name>filter-ex</filter-name><!--필터이름 지정 -->
        <filter-class>cafe.jjdev.FilterEx</filter-class><!--필터클래스이름 패키지위치까지 기재-->
    </filter>
    <!--1개의 웹 컴포넌트에 필터 적용시-->
    <filter-mapping>
        <filter-name>filter-ex</filter-name><!-- 매핑할 필터의 이름 -->
        <servlet-name>test-Servlet</servlet-name><!--필터를 적용할 컴포넌트의 이름  -->
        <!--같은 웹 애플리케이션 디렉터리 내의 모든 웹 컴포넌트에 필터 적용시-->
        <url-pattern>/*</url-pattern>
        <!--같은 웹 애플리케이션 디렉터리 내의 모든 jsp 페이지 내에 필터 적용시  -->
        <url-pattern>*.jsp</url-pattern>
        <!--특정 경로명으로 시작하는 모든 웹 컴포넌트에 필터 적용시-->
        <url-pattern>/board1</url-pattern>
    </filter-mapping>
</web-app>
cs



+ Recent posts