English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP 필터

JSP와 Servlet의 필터는 모두 Java 클래스입니다.

필터는 요청과 응답을 동적으로 차단하여 요청이나 응답에 포함된 정보를 변환하거나 사용할 수 있습니다.

한 개나 여러 개의 필터를 Servlet이나 Servlet 그룹에 추가할 수 있습니다. 필터는 JavaServer Pages (JSP) 파일과 HTML 페이지에도 추가할 수 있습니다.

필터는 Servlet 프로그래밍에 사용할 수 있는 Java 클래스로, 다음과 같은 목적을 달성할 수 있습니다:

  • 클라이언트의 요청이 백엔드 자원에 접근하기 전에 이를 차단합니다.

  • 서버의 응답이 클라이언트에게 보내지기 전에 이를 처리합니다.

규격에 따라 추천하는 여러 유형의 필터:

  • 인증 필터(Authentication Filters)

  • 데이터 압축 필터(Data compression Filters)

  • 암호화 필터(Encryption Filters)

  • 자원 접근 이벤트를 유발하는 필터

  • 이미지 변환 필터(Image Conversion Filters)

  • 로그기록 및 감사 필터(Logging and Auditing Filters)

  • MIME-TYPE 미디어 타입 체인 필터(TYPE MIME Chain Filters)-TYPE 체인 필터(TYPE Chain Filters)

  • 마킹 필터(Marking Filters)

  • XSL/T 필터(XSL)/T 필터(T Filters), XML 내용을 변환합니다.

필터는 web.xml 배포 설명자의 XML 태그를 통해 선언되고, 그런 다음 Servlet 이름이나 URL 패턴에 맞게应用程序의 배포 설명자에 매핑됩니다.

웹 컨테이너가 웹 애플리케이션을 시작할 때, 그는 배포 설명자(deployment descriptor)에서 선언한 각 필터에 대해 예제를 생성합니다.

필터의 실행 순서는 web.xml 설정 파일에서의 설정 순서와 일치하며, 일반적으로 모든 Servlet보다 먼저 필터를 설정합니다.

Servlet 필터 메서드

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

순번메서드 & 설명
1public void doFilter(ServletRequest, ServletResponse, FilterChain)
이 메서드는 실제 필터 작업을 완료합니다. 클라이언트의 요청이 필터가 설정한 URL과 일치할 때, Servlet 컨테이너는 필터의 doFilter 메서드를 호출합니다. FilterChain은 이후 필터에 접근하기 위해 사용됩니다.
2public void init(FilterConfig filterConfig)
웹 애플리케이션이 시작될 때, 웹 서버는 Filter의 예제 객체를 생성하고 init 메서드를 호출하여 web.xml 설정을 읽고 객체 초기화 기능을 완료하여 이후 사용자 요청을 차단하기 위한 준비를 마련합니다(필터 객체는 한 번만 생성되고, init 메서드는 한 번만 실행됩니다). 개발자는 init 메서드의 파라미터를 통해 현재 필터 설정 정보를 대표하는 FilterConfig 객체를 얻을 수 있습니다.
3public void destroy()}
Servlet 컨테이너는 필터 예제를 파괴하기 전에 이 메서드를 호출합니다. 이 메서드에서 Servlet 필터가 사용하는 자원을 해제합니다.

FilterConfig는

필터의 init 메서드는 FilterConfig 객체를 제공합니다.

예를 들어 web.xml 파일은 다음과 같이 구성됩니다:

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.w3codebox.test.LogFilter</filter-class>
    <init-param>
        <param-name>Site</param-name>
        <param-value>기본教程网</param-value>
    </init-param>
    </filter>

init 메서드에서 FilterConfig 객체를 사용하여 매개변수를 가져옵니다:

public void init(FilterConfig config) throws ServletException {
    // 초기화 매개변수 가져오기
    String site = config.getInitParameter("Site"); 
    // 초기화 매개변수 출력
    System.out.println("웹사이트 이름: " + site); 
}

JSP 필터 예제

아래는 Servlet 필터의 예제로, 웹사이트 이름과 주소를 출력합니다. 이 예제는 Servlet 필터에 대한 기본적인 이해를 제공하며, 이와 같은 개념을 사용하여 더 복잡한 필터 애플리케이션을 작성할 수 있습니다:

//必需의 java 라이브러리를 가져오기
import javax.servlet.*;
import java.util.*;
//Filter 클래스를 구현합니다
public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 초기화 매개변수 가져오기
        String site = config.getInitParameter("Site"); 
        // 초기화 매개변수 출력
        System.out.println("웹사이트 이름: " + site); 
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
        // 사이트 이름 출력
        System.out.println("사이트 주소:http://ko.oldtoolbag.com");
        // 요청을 필터링 체인으로 반환합니다
        chain.doFilter(request,response);
    }
    public void destroy( ){
        /* Filter 예제가 Web 컨테이너에서 서비스에서 제거되기 전에 호출됩니다 */
    }
}

DisplayHeader.java 파일 코드는 다음과 같습니다:

//必需의 java 라이브러리를 가져오기
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DisplayHeader)
//扩展 HttpServlet 类
public class DisplayHeader extends HttpServlet {
    // 处理 GET 方法请求的方法
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "HTTP Header 请求示例 - 基础教程网示例";
        String docType =
            "<!DOCTYPE html> \n";
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
            "<tr bgcolor=\"#949494\">\n" +
            "<th>Header 名称</th><th>Header 값</th>\n"+
            "</tr>\n");
        Enumeration headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String paramName = (String)headerNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String paramValue = request.getHeader(paramName);
            out.println("<td> " + paramValue + "</td></tr>\n");
        }
        out.println("</table>\n</body></html>");
    }
    // POST 메서드 요청을 처리하는 메서드
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Web.xml의 Servlet 필터 매핑(Servlet Filter Mapping)

필터를 정의하고 URL이나 Servlet에 매핑하면 Servlet을 정의하고 URL 패턴에 매핑하는 방식과 유사합니다. 배포 설명서 파일 web.xml filter 태그를 위한 아래의 항목을 생성합니다:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.w3codebox.test.LogFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>기본教程网</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>  
  <!-- 클래스 이름 -->  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- 이있는 패키지 -->  
  <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class>  
</servlet>  
<servlet-mapping>  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- 방문한 웹사이트 -->  
  <url-pattern>/TomcatTest/DisplayHeader</url-pattern>  
</servlet-mapping>  
</web-app>

위의 필터는 모든 Servlet에 적용됩니다. 왜냐하면 우리는 설정에서 지정했기 때문입니다. /* 만약 몇 가지 Servlet에서만 필터를 적용하고 싶다면, 특정 Servlet 경로를 지정할 수 있습니다.

일반적으로 사용하는 방식으로 Servlet을 호출해보세요. 웹 서버에서 생성된 로그를 볼 수 있습니다. 또한 Log를 사용할 수도 있습니다.4J 레코드르이용하여 위의 로그를 별도의 파일에 기록합니다.

接下来我们访问这个示例地址 http://localhost:8080/TomcatTest/DisplayHeader,然后在控制台看下输出内容

使用多个过滤器

Web 应用程序可以根据特定的目的定义若干个不同的过滤器。假设您定义了两个过滤器 AuthenFilterLogFilter。您需要创建一个如下所述的不同的映射,其余的处理与上述所讲解的大致相同:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>com.w3codebox.test.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>com.w3codebox.test.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 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。

例如,上面的示例将先应用 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>

web.xml配置各节点说明

  • <filter>指定一个过滤器。

    • <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

    • <filter-class>元素用于指定过滤器的完整的限定类名。

    • <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。

    • 在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

  • <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

    • <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

    • <url-pattern>는 필터가 차단할 요청 경로(필터와 연결된 URL 스타일)을 설정합니다.

  • <servlet-name>는 필터가 차단하는 Servlet 이름을 지정합니다.

  • <dispatcher>는 Servlet 컨테이너가 필터가 차단하는 자원을 호출하는 방식을 지정합니다. REQUEST, INCLUDE, FORWARD, ERROR 중 하나입니다. 기본적으로 REQUEST입니다. 사용자는 Filter가 자원의 여러 호출 방식을 차단하도록 여러 <dispatcher> 서브 요소를 설정할 수 있습니다.

  • <dispatcher> 서브 요소가 설정할 수 있는 값과 의미

    • REQUEST: 사용자가 페이지를 직접 접근할 때, 웹 컨테이너가 필터를 호출합니다. 목표 자원이 RequestDispatcher의 include() 또는 forward() 메서드를 통해 접근된 경우, 이 필터는 호출되지 않습니다.

    • INCLUDE: 목표 자원이 RequestDispatcher의 include() 메서드를 통해 접근된 경우, 이 필터가 호출됩니다. 이 외의 경우 필터는 호출되지 않습니다.

    • FORWARD: 목표 자원이 RequestDispatcher의 forward() 메서드를 통해 접근된 경우, 이 필터가 호출됩니다. 이 외의 경우 필터는 호출되지 않습니다.

    • ERROR: 목표 자원이 표현식 예외 처리 메커니즘을 통해 호출된 경우, 이 필터가 호출됩니다. 이 외의 경우 필터는 호출되지 않습니다.