Latest web development tutorials

JSP 필터

모든 자바 클래스에 JSP와 서블릿 필터.

동적으로 요청이나 응답에 포함 된 정보를 변환하거나 사용하기 위해 요청 및 응답을 인터셉트 할 수있는 필터를 포함한다.

한 가지 이상의 필터 서블릿 또는 서블릿에 부착 될 수있다. 필터는 또한 자바 서버 페이지 (JSP) 파일 및 HTML 페이지에 부착 될 수있다.

필터를 사용하면 다음과 같은 목표를 달성 할 수있는, 자바 서블릿 프로그래밍 클래스에 사용할 수 있습니다 :

  • 액세스를 요청하는 것은 이러한 요청을 인터셉트 자원, 클라이언트 백엔드하기 전에.
  • 서버는 이러한 응답을 처리하는 클라이언트에게 응답을 전송하기 전에.

필터의 다양한 형태가 권장 사양에 따르면

  • 인증 필터 (인증 필터).
  • 데이터 압축 필터 (데이터 압축 필터).
  • 암호화 필터 (암호화 필터).
  • 리소스 액세스 트리거 이벤트 필터.
  • 이미지 변환 필터 (이미지 변환 필터).
  • 로깅 및 감사 필터 (로깅 및 감사 필터).
  • MIME-TYPE 체인 필터 (MIME-TYPE 체인 필터).
  • 레이블 필터 (토큰 화 필터).
  • XSL / T 필터 (XSL / T 필터), XML 콘텐츠를 변환.

웹 문을 통해 XML 태그에 배포 설명자 (web.xml을)를 필터링 한 다음 응용 프로그램의 배포 설명 서블릿 이름이나 URL 패턴에 매핑.

웹 컨테이너는 웹 응용 프로그램을 시작하면 인스턴스를 생성하기 위해 각 필터의 ​​배치 기술자 선언에 당신을위한 것입니다.

필터링 실행 순서는 web.xml의 구성 파일 배열 순서 모든 서블릿 전에 보통 필터 구성과 일치한다.

서블릿 필터 방법

이 필터는 javax.servlet.Filter 인터페이스를 구현하는 자바 클래스입니다. javax.servlet.Filter 인터페이스는 세 가지 방법을 정의한다 :

序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
2public void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
3public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

FilterConfig 사용

필터의 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); 
}

JSP 필터 인스턴스

다음은 서블릿 필터 출력 웹 사이트의 이름과 주소의 예이다. 서블릿 예제는 당신에게 필터의 기본적인 이해를 제공하기 위해, 당신은 더 복잡한 필터 응용 프로그램을 작성하는 데 동일한 개념을 사용할 수 있습니다 :

//导入必需的 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.w3big.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을 (서블릿 필터 매핑)

필터, 다음 서블릿을 정의하는 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>

각 노드에 대한 web.xml을 구성 지침

  • <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 , FORWARDERROR 하나가 기본 REQUEST . 사용자가 여러를 설정할 수 있습니다 <dispatcher> 하위 요소는 자원 필터를 호출을 차단하기 위해 여러 가지 방법을 지정하는 데 사용됩니다.
  • <dispatcher> 를 설정할 수 있습니다 값과 하위 요소의 의미
    • REQUEST : 페이지에 사용자가 직접 액세스, 웹 컨테이너 필터를 호출한다. 타겟 자원에 액세스 할 수있는 방법이면, 필터는이 RequestDispatcher의 포함 () 또는 전방 ()에 의해 호출되지 않을 것이다.
    • INCLUDE : 대상 자원이 RequestDispatcher의의가 (), 다음 필터가 호출됩니다 포함 통해 액세스됩니다. 또한, 필터가 호출되지 않습니다.
    • FORWARD : 대상 자원이 앞으로 RequestDispatcher를 통해 액세스 할 경우 () 메소드는 다음 필터가 호출됩니다,뿐만 아니라, 필터가 호출되지 않습니다.
    • ERROR : 대상 리소스라고 선언 예외 처리기구를 통해이면 필터라고한다. 또한, 필터가 호출되지 않습니다.