Servlet과 JSP의 필터는 Java 클래스이며, 그 존재 목적은 다음과 같습니다.
백엔드 리소스에 대한 액세스 요청 시 가로채기
서버에서 클라이언트로 반환되는 응답을 관리합니다.
몇 가지 일반적인 필터 유형은 다음과 같습니다.
인증 필터
데이터 압축 필터
암호화 필터
리소스 액세스 이벤트를 트리거하는 필터
이미지 변환 필터
로그인 및 인증 필터
MIME 유형 체인 필터
토큰 필터
XML 콘텐츠 변환을 위한 XSL/T 필터
필터는 web.xml 파일에 삽입되고 서블릿 이름, JSP 파일 또는 URL 패턴에 매핑됩니다. 배포 설명 파일 web.xml은 <Tomcat-installation-directory>conf 디렉터리에서 찾을 수 있습니다.
JSP 컨테이너는 웹 애플리케이션을 시작할 때 각 필터의 인스턴스를 생성합니다. 이러한 필터는 배포 설명자 파일 web.xml에서 선언되고 선언된 순서대로 실행되어야 합니다.
필터는 javax.servlet.Filter 인터페이스를 구현하는 Java 클래스입니다. javax.servlet.Filter 인터페이스는 세 가지 메소드를 정의합니다.
일련번호 | 방법 및 설명 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 클라이언트가 체인 끝에서 리소스를 요청하기 때문에 요청/응답이 필터 체인을 통과할 때마다 컨테이너는 이 메서드를 호출합니다. |
2 | public void init(FilterConfig filterConfig) 컨테이너는 필터가 서비스에 배치되었음을 나타내기 위해 이 메소드를 호출합니다. |
3 | public void destroy() 이 메소드는 필터가 서비스에서 제거되고 있음을 나타내기 위해 컨테이너에 의해 호출됩니다. |
이 예에서는 JSP 파일에 대한 각 액세스의 IP 주소와 날짜 및 시간을 인쇄합니다. 물론 이것은 간단한 필터 사용법에 대한 아이디어를 제공하기 위한 간단한 예일 뿐이지만 이러한 개념을 사용하여 더 복잡한 프로그램을 직접 구성할 수 있습니다.
//Java 패키지 소개 import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.* //Filter 클래스 구현 public class LogFilter Implements Filter { public void init( FilterConfig config) throws ServletException{ // 초기화 매개변수 가져오기 String testParam = config.getInitParameter("test-param"); //초기화 매개변수 인쇄 System.out.println("Test Param: " + testParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // 클라이언트 IP 주소 가져오기 String ipAddress = request.getRemoteAddr(); // IP 주소와 현재 시간 출력 System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // 요청 필터 체인을 전달합니다. chain.doFilter(request,response) } public void destroy( ){ /* 필터 인스턴스가 파괴된 후 서버 제거 전에 호출됩니다. */ }}
LogFilter.java 파일을 컴파일한 후 컴파일된 클래스 파일을 <Tomcat 설치 디렉터리>/webapps/ROOT/WEB-INF/classes 디렉터리에 배치합니다.
서블릿이 정의되고 매핑되는 방식과 마찬가지로 필터가 정의된 다음 URL 또는 JSP 파일 이름에 매핑됩니다. 배포 설명 파일 web.xml에서 필터 매핑을 위해 <filter> 태그를 사용합니다.
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >초기화 매개변수</param-value> </init-param></filter><filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
위의 필터는 구성에서 "/*"를 지정했기 때문에 모든 서블릿 및 JSP 프로그램에 적용됩니다. 몇몇 서블릿이나 JSP 프로그램에만 필터를 적용하려는 경우 서블릿이나 JSP 경로를 지정할 수도 있습니다.
이제 평소대로 서블릿이나 JSP 페이지에 액세스하면 서버 로그에서 이 액세스 기록을 찾을 수 있습니다. Log4J 로거를 사용하여 다른 파일에 기록할 수도 있습니다.
웹 애플리케이션은 다양한 필터를 정의할 수 있습니다. 이제 AuthenFilter와 LogFilter라는 두 개의 필터가 정의되었으므로 다음과 같이 다른 매핑을 생성한다는 점을 제외하면 다른 단계는 이전과 동일합니다.
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value >초기화 매개변수</param-value> </init-param></filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>초기화 매개변수</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
web.xml에 있는 <filter> 요소의 매핑 순서에 따라 컨테이너가 이러한 필터를 적용하는 순서가 결정됩니다. 적용 순서를 바꾸려면 web.xml에 정의된 <filter> 요소의 순서를 바꾸면 됩니다.
예를 들어 위의 예에서는 LogFilter를 먼저 적용한 다음 AuthenFilter를 적용하지만 다음 예에서는 적용 순서를 바꿉니다.
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -name> <url-pattern>/*</url-pattern></filter-mapping>