Latest web development tutorials

Servlets Filter schreiben

Servlet-Filter können ab sein dynamisch die Anfrage und Antwort, um in der Anfrage oder Antwort enthaltenen Informationen zu transformieren oder zu verwenden.

Ein oder mehrere Servlet-Filter können zu einem Servlet oder einem Servlet befestigt werden. Servlet-Filter können auch auf die Javaserver Pages (JSP) Dateien und HTML-Seiten angebracht werden. Aufruf an alle zusätzlichen Servlets Filter vor Servlets aufrufen.

Servlet-Filter sind für die Java-Servlet-Programmierung Klasse verfügbar sind, können Sie die folgenden Ziele erreichen:

  • Vor dem Zugriff anfordert abfangen diese Anfragen an Back-End-Ressourcen, Client.
  • Bevor der Server sendet die Antwort zurück an den Client mit diesen Antworten zu behandeln.

Gemäß der Spezifikation, die von den verschiedenen Arten von Filtern empfohlen:

  • Authentifizierungsfilter (Authentication-Filter).
  • Die Datenkompression Filter (Datenkompression-Filter).
  • Encryption Filter (Encryption-Filter).
  • Resource Access Trigger Ereignisfilter.
  • Bildkonvertierungsfilter (Bildkonvertierung Filter).
  • Logging und Auditing-Filter (Logging und Auditing-Filter).
  • MIME-TYPE Chain-Filter (MIME-Type Kette-Filter).
  • Beschriftete Filter (Tokenizing-Filter).
  • XSL / T-Filter (XSL / T Filter), Transformieren von XML-Inhalten.

Filter Deployment Descriptor (web.xml) in XML-Tags über die Web-Anweisung und dann abgebildet Ihrer Anwendung Deployment Descriptor Servlet-Namen oder URL-Muster.

Wenn der Web-Container eine Web-Anwendung zu starten, wird es für jeden Filter im Deployment Descriptor Erklärung für Sie sein, eine Instanz zu erstellen.

Filter-Ausführungsreihenfolge ist mit der Reihenfolge der Anordnung in der web.xml Konfigurationsdatei, in der Regel die Filterkonfiguration vor allen Servlets konsistent.

Servlets Filtermethode

Der Filter ist eine Java-Klasse, die javax.servlet.Filter-Schnittstelle implementiert. javax.servlet.Filter Schnittstelle definiert drei Methoden:

序号方法 & 描述
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 Einsatz

Filter der init-Methode bietet eine FilterConfig Objekt.

Web.xml Datei-Konfiguration wie folgt:

<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>

Verwenden Sie FilterConfig Objekt die Parameter in der init-Methode zu erhalten:

public void  init(FilterConfig config) throws ServletException {
	// 获取初始化参数
	String site = config.getInitParameter("Site"); 
	// 输出初始化参数
	System.out.println("网站名称: " + site); 
}

Servlets Filterinstanz

Im folgenden sind Beispiele für Servlet-Filter, Ausgabenamen und Website-Adresse. Die Servlet Beispiele, die Ihnen ein grundlegendes Verständnis des Filters zu geben, können Sie das gleiche Konzept verwenden komplexere Filteranwendungen zu schreiben:

package com.w3big.test;

//导入必需的 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 容器从服务移除之前调用 */
	}
}

Hier wird die Verwendung der zuvor erwähnten DisplayHeader.java als Beispiel:

//导入必需的 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 die Servlet-Filterzuordnung (Servlet Filter Mapping)

Filter definieren, dann abgebildet zu einer URL oder Servlets, die die Servlet zu definieren, und dann zu einem URL-Muster der gleichen Weise abgebildet. Erstellen Sie den folgenden Eintrag für den Filter - Tag in der Deployment Descriptor Dateiweb.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>  

Der Filter gilt für alle Servlets, weil wir in der Konfiguration/ * angegeben.Wenn Sie einen Filter auf eine kleine Anzahl von Servlets anwenden möchten, können Sie einen bestimmten Servlet-Pfad angeben.

Nun versucht man die übliche Art und Weise jede Servlet aufrufen, sehen Sie die generierten Web-Server-Logs zu sehen. Sie können auch den Recorder an den oben Log4J Logging in eine separate Datei verwenden.

Als nächstes besuchen wir diese http Instanz Adresse: // localhost: 8080 / TomcatTest / DisplayHeader, dann in der Konsole am Ausgang sehen, wie folgt:

Verwendung einer Mehrzahl von Filtern

Web-Anwendungen können mehrere verschiedene Filter auf den spezifischen Zweck definiert basieren. Angenommen , Sie zwei FilterAuthenFilterundLogFilterdefinierthaben.Sie benötigen eine andere Zuordnung unten beschrieben zu erzeugen und über den Rest des Verfahrens ist im wesentlichen die gleiche Erklärung:

<Filter>
   <Filter-name> LogFilter </ filter-name>
   <Filter-Klasse> com.w3big.test.LogFilter </ filter-class>
   <Init-param>
	  <Param-name> Test-param </ param-name>
	  <Param-value> Initialisierung Paramter </ param-value>
   </ Init-param>
</ Filter>

<Filter>
   <Filter-name> AuthenFilter </ filter-name>
   <Filter-Klasse> com.w3big.test.AuthenFilter </ filter-class>
   <Init-param>
	  <Param-name> Test-param </ param-name>
	  <Param-value> Initialisierung Paramter </ param-value>
   </ Init-param>
</ Filter>

<Filter-mapping>
   <Filter-name> LogFilter </ filter-name>
   <URL-Muster> / * </ url-pattern>
</ Filter-mapping>

<Filter-mapping>
   <Filter-name> AuthenFilter </ filter-name>
   <URL-Muster> / * </ url-pattern>
</ Filter-mapping>

Filter angewendet werden sequentiell

Bestellen Sie in web.xml filter-mapping-Element bestimmt den Web-Container-Filter in der Reihenfolge des Servlets anzuwenden. Um die Ordnung des Filters umkehren, müssen Sie nur den Filter-Mapping-Element in der Datei web.xml umkehren.

Zum Beispiel wird das obige Beispiel die erste Anwendung LogFilter sein, dann gelten AuthenFilter, aber die folgenden Beispiele wird diese Reihenfolge umkehren:

<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 Konfigurationsanweisungen für jeden Knoten

  • <filter> Gibt einen Filter.
    • <filter-name> verwendet wird , einen Namen für den Filter angeben, kann der Inhalt des Elements nicht leer sein.
    • <filter-class> Element wird verwendet , um den vollständig qualifizierten Klassennamen des Filters zu spezifizieren.
    • <init-param> Element wird verwendet Initialisierung Parameter für den Filter angeben, die untergeordneten Elemente <param-name> gibt den Namen des Parameters, <param-value> die Wert angegebenen Parametern.
    • Im Filter können Sie verwenden FilterConfig Interface - Objekt für den Zugriff auf die Initialisierung Parameter.
  • <filter-mapping> Element wird verwendet , abgefangen ein Filter Ressource verantwortlich zu setzen. Filter abfangen eine Ressource kann auf zwei Arten angegeben werden: die Anforderungspfad Servletnamen und Ressourcenzugriff
    • <filter-name> Kind - Element wird verwendet , um den eingetragenen Namen des Filters. Der Wert muss in den sein <filter> im Namen des Filterelements Erklärungen durch
    • <url-pattern> gesetzt Filter abgefangen Anfragepfad (Filter zugeordnet URL - Stil)
  • <servlet-name> gibt den Filter Servletnamen blockiert.
  • <dispatcher> geben Sie den Filter abgefangen Ressourcen Servlet - Container genannt werden, bei dem es sich REQUEST , INCLUDE , FORWARD und ERROR ein Standard REQUEST . Benutzer können mehrere einrichten <dispatcher> Unterelement wird verwendet , um die Ressource - Filter mehrere Möglichkeiten angeben Anrufe abfangen.
  • <dispatcher> Wert und die Bedeutung von Unterelementen , die eingestellt werden können ,
    • REQUEST : Wenn der Benutzer direkten Zugriff auf Seiten, Web - Container wird der Filter nennen. Wenn das Ziel ein Verfahren ist, auf die Ressource zuzugreifen, wird der Filter nicht durch die Request die umfassen () oder nach vorne () aufgerufen werden.
    • INCLUDE : Wenn die Zielressource über den Request die zugegriffen wird include (), dann wird der Filter aufgerufen werden. Darüber hinaus wird nicht die Filter genannt.
    • FORWARD : Wenn die Zielressource durch ein Request zugegriffen wird vorwärts () -Methode, dann wird der Filter genannt werden, zusätzlich wird der Filter nicht aufgerufen werden.
    • ERROR : Wenn die Zielressource deklarative Ausnahmebehandlungsmechanismus ist durch genannt, dann wird der Filter bezeichnet werden. Außerdem wird nicht das Filter bezeichnet werden.