필터(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 |
'JSP&Servlet' 카테고리의 다른 글
이벤트 리스너(event listener) (0) | 2017.02.26 |
---|---|
ServletContext / ServletConfig init-param 차이점 (0) | 2017.02.26 |
ServletContext 객체 (0) | 2017.02.26 |
서블릿의 초기화 파라미터 / init-param (0) | 2017.02.26 |
서블릿 클래스의 init 메서드/destroy 메서드 (0) | 2017.02.26 |