English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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보다 먼저 필터를 설정합니다.
필터는 javax.servlet.Filter 인터페이스를 구현한 Java 클래스입니다. javax.servlet.Filter 인터페이스는 세 가지 메서드를 정의합니다:
순번 | 메서드 & 설명 |
---|---|
1 | public void doFilter(ServletRequest, ServletResponse, FilterChain) 이 메서드는 실제 필터 작업을 완료합니다. 클라이언트의 요청이 필터가 설정한 URL과 일치할 때, Servlet 컨테이너는 필터의 doFilter 메서드를 호출합니다. FilterChain은 이후 필터에 접근하기 위해 사용됩니다. |
2 | public void init(FilterConfig filterConfig) 웹 애플리케이션이 시작될 때, 웹 서버는 Filter의 예제 객체를 생성하고 init 메서드를 호출하여 web.xml 설정을 읽고 객체 초기화 기능을 완료하여 이후 사용자 요청을 차단하기 위한 준비를 마련합니다(필터 객체는 한 번만 생성되고, init 메서드는 한 번만 실행됩니다). 개발자는 init 메서드의 파라미터를 통해 현재 필터 설정 정보를 대표하는 FilterConfig 객체를 얻을 수 있습니다. |
3 | public void destroy()} Servlet 컨테이너는 필터 예제를 파괴하기 전에 이 메서드를 호출합니다. 이 메서드에서 Servlet 필터가 사용하는 자원을 해제합니다. |
필터의 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); }
아래는 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); } }
필터를 정의하고 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 应用程序可以根据特定的目的定义若干个不同的过滤器。假设您定义了两个过滤器 AuthenFilter 和 LogFilter。您需要创建一个如下所述的不同的映射,其余的处理与上述所讲解的大致相同:
<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>
<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: 목표 자원이 표현식 예외 처리 메커니즘을 통해 호출된 경우, 이 필터가 호출됩니다. 이 외의 경우 필터는 호출되지 않습니다.