최고의 JSP 필터 튜토리얼 2024년, 이 튜토리얼에서는 서블릿 필터 방법,JSP 필터 인스턴스,복수의 필터를 사용하여,필터는 순차적으로 적용됩니다,각 노드에 대한 web.xml을 구성 지침,를 배울 수 있습니다.
모든 자바 클래스에 JSP와 서블릿 필터.
동적으로 요청이나 응답에 포함 된 정보를 변환하거나 사용하기 위해 요청 및 응답을 인터셉트 할 수있는 필터를 포함한다.
한 가지 이상의 필터 서블릿 또는 서블릿에 부착 될 수있다. 필터는 또한 자바 서버 페이지 (JSP) 파일 및 HTML 페이지에 부착 될 수있다.
필터를 사용하면 다음과 같은 목표를 달성 할 수있는, 자바 서블릿 프로그래밍 클래스에 사용할 수 있습니다 :
필터의 다양한 형태가 권장 사양에 따르면
웹 문을 통해 XML 태그에 배포 설명자 (web.xml을)를 필터링 한 다음 응용 프로그램의 배포 설명 서블릿 이름이나 URL 패턴에 매핑.
웹 컨테이너는 웹 응용 프로그램을 시작하면 인스턴스를 생성하기 위해 각 필터의 배치 기술자 선언에 당신을위한 것입니다.
필터링 실행 순서는 web.xml의 구성 파일 배열 순서 모든 서블릿 전에 보통 필터 구성과 일치한다.
이 필터는 javax.servlet.Filter 인터페이스를 구현하는 자바 클래스입니다. javax.servlet.Filter 인터페이스는 세 가지 방법을 정의한다 :
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
필터의 init 메소드는 FilterConfig 오브젝트를 제공합니다.
의 web.xml 파일 구성은 다음과 같습니다 :
<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.w3big.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); }
다음은 서블릿 필터 출력 웹 사이트의 이름과 주소의 예이다. 서블릿 예제는 당신에게 필터의 기본적인 이해를 제공하기 위해, 당신은 더 복잡한 필터 응용 프로그램을 작성하는 데 동일한 개념을 사용할 수 있습니다 :
//导入必需的 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://www.w3write.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 또는 서블릿에 매핑하고 많은 URL 패턴 같은 방법으로 매핑을 정의합니다. 전개 디스크립터 파일web.xml에 필터 태그의 다음 항목을 만듭니다
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3big.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.w3big.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- 访问的网址 --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
우리는 구성에 지정된 때문에 필터는* / 모든 서블릿에 적용됩니다.당신이 서블릿의 작은 숫자에 필터를 적용 할 경우, 특정 서블릿 경로를 지정할 수 있습니다.
이제 생성 된 웹 서버 로그를 볼 수 있습니다, 어떤 서블릿을 호출하는 일반적인 방법을 시도해보십시오. 또한 별도의 파일로 위의 log4j 로깅 레코더를 사용할 수 있습니다.
다음으로 우리는이 경우 주소에 http를 방문 : // localhost를 : 8080 / TomcatTest / DisplayHeader, 다음과 같이 콘솔에 출력 보면 :
웹 응용 프로그램에 정의 된 특정 목적에 따라 여러 가지 필터가 될 수 있습니다. 두 개의 필터AuthenFilter과에LogFilter을 정의하자. 아래 설명 된 다른 맵핑을 작성해야하고, 나머지 프로세스 위에 실질적으로 동일한 설명이다 :
<필터> <필터 이름>에 LogFilter </ 필터 이름> <필터 클래스> com.w3big.test.LogFilter </ 필터 클래스> <초기화-PARAM> <파람 이름> 테스트 PARAM </ PARAM 이름> <파람 값> 초기화 있었던 파라미터 </ PARAM 값> </ 초기화-PARAM> </ 필터> <필터> <필터 이름> AuthenFilter </ 필터 이름> <필터 클래스> com.w3big.test.AuthenFilter </ 필터 클래스> <초기화-PARAM> <파람 이름> 테스트 PARAM </ PARAM 이름> <파람 값> 초기화 있었던 파라미터 </ PARAM 값> </ 초기화-PARAM> </ 필터> <필터 매핑> <필터 이름>에 LogFilter </ 필터 이름> <URL 패턴> / * </ URL 패턴> </ 필터 매핑> <필터 매핑> <필터 이름> AuthenFilter </ 필터 이름> <URL 패턴> / * </ URL 패턴> </ 필터 매핑>
web.xml에 필터 매핑 요소의 순서는 서블릿의 순서에 필터를 적용 할 수있는 웹 컨테이너를 결정합니다. 필터의 순서를 바꾸려면, 당신은 단지 web.xml 파일에서 필터 매핑 요소를 반대해야합니다.
예를 들어, 상기 예에서는 제 1 애플리케이션에 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-name>
하위 요소는 필터의 등록 된 이름을 설정하는 데 사용된다. 값은 여야 <filter>
필터의 이름을 통해 요소 선언 <url-pattern>
차단 설정 필터 요청 경로 (필터 관련 URL 스타일) <servlet-name>
필터가 서블릿 이름을 차단 지정합니다. <dispatcher>
이 될 수 도청 자원이 서블릿 컨테이너라고 필터 지정 REQUEST
, INCLUDE
, FORWARD
및 ERROR
하나가 기본 REQUEST
. 사용자가 여러를 설정할 수 있습니다 <dispatcher>
하위 요소는 자원 필터를 호출을 차단하기 위해 여러 가지 방법을 지정하는 데 사용됩니다. <dispatcher>
를 설정할 수 있습니다 값과 하위 요소의 의미 REQUEST
: 페이지에 사용자가 직접 액세스, 웹 컨테이너 필터를 호출한다. 타겟 자원에 액세스 할 수있는 방법이면, 필터는이 RequestDispatcher의 포함 () 또는 전방 ()에 의해 호출되지 않을 것이다. INCLUDE
: 대상 자원이 RequestDispatcher의의가 (), 다음 필터가 호출됩니다 포함 통해 액세스됩니다. 또한, 필터가 호출되지 않습니다. FORWARD
: 대상 자원이 앞으로 RequestDispatcher를 통해 액세스 할 경우 () 메소드는 다음 필터가 호출됩니다,뿐만 아니라, 필터가 호출되지 않습니다. ERROR
: 대상 리소스라고 선언 예외 처리기구를 통해이면 필터라고한다. 또한, 필터가 호출되지 않습니다.