서블릿 작성 필터


서블릿 필터는 다음 목적으로 서블릿 프로그래밍에 사용할 수 있는 Java 클래스입니다.

  • 클라이언트 요청이 백엔드 리소스에 액세스하기 전에 차단합니다.

  • 클라이언트로 다시 전송되기 전에 서버의 응답을 처리합니다.

사양에서 권장하는 다양한 유형의 필터:

  • 인증 필터.

  • 데이터 압축 필터.

  • 암호화 필터.

  • 리소스 액세스 이벤트 필터를 트리거합니다.

  • 이미지 변환 필터.

  • 로깅 및 감사 필터.

  • MIME 유형 체인 필터.

  • 토큰화 필터.

  • XSL/T 필터(XSL/T 필터), XML 콘텐츠를 변환합니다.

필터는 배포 설명자 파일 web.xml에 배포된 다음 애플리케이션 배포 설명자의 서블릿 이름 또는 URL 패턴에 매핑됩니다.

웹 컨테이너는 웹 애플리케이션을 시작할 때 배포 설명자에 선언한 각 필터에 대한 인스턴스를 생성합니다. 필터는 배포 설명자에 선언된 순서대로 실행됩니다.

서블릿 필터 메소드

필터는 javax.servlet.Filter 인터페이스를 구현하는 Java 클래스입니다. javax.servlet.Filter 인터페이스는 세 가지 메소드를 정의합니다:

일련 번호방법 및 설명
1
序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用。
2public void init(FilterConfig filterConfig)
该方法由 Web 容器调用,指示一个过滤器被放入服务。
3public void destroy()
该方法由 Web 容器调用,指示一个过滤器被取出服务。
public void doFilter(ServletRequest, ServletResponse, FilterChain)<🎜>
클라이언트가 체인 끝에서 리소스를 요청하여 요청/응답 쌍이 체인을 통해 전달될 때마다 컨테이너에 의해 메서드가 호출됩니다.
2<🎜>public void init(FilterConfig filterConfig)<🎜>
이 메소드는 웹 컨테이너에 의해 호출되어 필터가 서비스에 투입되었습니다.
3<🎜>public void destroy()<🎜>
이 메서드는 웹 컨테이너에서 호출되어 필터가 테이크 아웃됩니다.

서블릿 필터 예시

다음은 클라이언트의 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( ){
      /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
   }
}

일반적인 방법으로 LogFilter.java를 컴파일하고 클래스를 배치하세요. <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes에 있는 파일입니다.

Web.xml의 서블릿 필터 매핑

필터를 정의한 다음 이를 URL 또는 서블릿에 매핑합니다. 이는 서블릿을 정의한 후 URL 패턴에 매핑하는 것과 같습니다. 동일합니다. 배포 설명자 파일 web.xml에서 필터 태그에 대해 다음 항목을 만듭니다.

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

위 필터는 구성 <🎜에서 /*를 지정하기 때문에 모든 서블릿에 적용됩니다. > . 몇 개의 서블릿에만 필터를 적용하려는 경우 특정 서블릿 경로를 지정할 수 있습니다.

이제 일반적인 방법으로 서블릿을 호출하면 웹 서버에 생성된 로그를 볼 수 있습니다. Log4J 로거를 사용하여 위의 내용을 별도의 파일에 기록할 수도 있습니다.

다중 필터 사용

웹 애플리케이션은 특정 목적에 따라 여러 가지 필터를 정의할 수 있습니다. 두 개의 필터

AuthenFilterLogFilter를 정의한다고 가정해 보겠습니다. 아래 설명과 같이 다른 매핑을 만들어야 하며 나머지 처리는 위에서 설명한 것과 거의 동일합니다.

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   <init-param>
	  <param-name>test-param</param-name>
	  <param-value>Initialization Paramter</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>Initialization Paramter</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-mapping 요소. xml 순서는 웹 컨테이너가 서블릿에 필터를 적용하는 순서를 결정합니다. 필터 순서를 바꾸려면 web.xml 파일에서 필터 매핑 요소를 바꾸면 됩니다.

예를 들어 위의 예에서는 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>