JSP 필터


서블릿과 JSP의 필터는 Java 클래스이며 존재 목적은 다음과 같습니다.

  • 백엔드 리소스에 대한 액세스 요청 시 가로채기

  • 서버에서 클라이언트로 반환된 응답 관리

아래에는 일반적으로 사용되는 여러 가지 필터 유형이 나열되어 있습니다.

  • 인증 필터

  • 데이터 압축 필터

  • 암호화 필터

  • 이벤트에 대한 리소스 액세스 필터

  • 이미지 변환 필터

  • 로그인 및 인증 필터

  • MIME 유형 체인 필터

  • 토큰 필터

  • XML 콘텐츠를 변환하는 XSL/T 필터

필터가 웹에 삽입됩니다. .xml 파일을 만들고 서블릿, JSP 파일 또는 URL 패턴의 이름을 매핑합니다. 배포 설명 파일 web.xml은 <Tomcat-installation-directory>conf 디렉터리에서 찾을 수 있습니다.

JSP 컨테이너는 웹 애플리케이션을 시작할 때 각 필터의 ​​인스턴스를 생성합니다. 이러한 필터는 배포 설명자 파일 web.xml에서 선언되고 선언된 순서대로 실행되어야 합니다.


서블릿 필터 메소드

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

< th>방법 &설명
일련 번호
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
序号方法 &描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)


每当 request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
2public void init(FilterConfig filterConfig)


容器调用这个方法来表明一个过滤器被安置在服务中
3public void destroy()


容器调用这个方法来表明一个过滤器正在从服务中移除

<🎜>클라이언트가 마지막에 리소스를 요청하기 때문에 요청/응답이 필터 체인을 통과할 때마다 컨테이너는 이 메소드를 호출합니다. 체인의< /td>
2public void init(FilterConfig filterConfig)<🎜>
<🎜> 컨테이너가 이 메소드를 호출합니다. 필터가 서비스에 배치되었음을 나타냅니다.
3public void destroy()<🎜>
<🎜>컨테이너는 이 메소드를 호출하여 서비스에서 필터가 제거되고 있음을 나타냅니다.

JSP 필터 예

이 예는 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( ){
      /* 在Filter实例在服务器上被移除前调用。*/
   }
}

LogFilter.java 파일을 컴파일한 후 컴파일된 클래스 파일을 <Tomcat 설치 디렉터리>/webapps/ROOT/WEB-INF/classes 디렉터리에 넣습니다.


web.xml 파일의 JSP 필터 매핑

서블릿을 정의한 후 필터를 정의한 다음 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>Initialization Paramter</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>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> 요소가 매핑되는 순서에 따라 컨테이너가 이러한 필터를 적용하는 순서가 결정됩니다. 적용 순서를 바꾸려면 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>