Latest web development tutorials

Filtres Servlet d'écriture

les filtres de servlets peuvent être dynamiquement intercepte la demande et de réponse afin de transformer ou d'utiliser les informations contenues dans la demande ou de la réponse.

Un ou plusieurs filtres de servlets peuvent être attachés à un servlet ou un Servlet. des filtres de servlet peuvent également être fixés sur les JavaServer Pages (JSP) des fichiers et des pages HTML. Appel à tous les filtres Servlet supplémentaires avant d'appeler Servlet.

des filtres de servlet sont disponibles pour la classe de programmation Java Servlet, vous pouvez atteindre les objectifs suivants:

  • Avant de demander l'accès aux back-end ressources, client intercepter ces demandes.
  • Avant que le serveur envoie la réponse au client pour faire face à ces réponses.

Conformément à la spécification recommandée par les différents types de filtres:

  • Filtre d'authentification (Filtres d'authentification).
  • filtre de compression de données (filtres de compression de données).
  • Filtres de chiffrement (Filtres de chiffrement).
  • Accès aux ressources déclencheur filtre d'événement.
  • les filtres de conversion d'image (filtres de conversion d'image).
  • Journalisation et d'audit filtres (journalisation et d'audit Filtres).
  • Filtre à chaîne MIME-TYPE (Filtres chaîne MIME-TYPE).
  • Filtre Étiqueté (Filtres tokenizing).
  • / Filtre XSL T (XSL / Filtres T), la transformation de contenu XML.

Filtre descripteur de déploiement (web.xml) dans les balises XML via le compte de Web, puis mappé sur le descripteur de déploiement nom de servlet ou d'URL de votre application.

Lorsque le conteneur Web pour lancer une application Web, il sera pour vous dans la déclaration du descripteur de déploiement pour chaque filtre pour créer une instance.

ordre d'exécution de filtre est compatible avec l'ordre d'arrangement dans le fichier de configuration web.xml, généralement la configuration du filtre avant tout Servlet.

Méthode Servlet Filter

Le filtre est une classe Java qui implémente l'interface javax.servlet.Filter. Interface javax.servlet.Filter définit trois méthodes:

序号方法 & 描述
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过滤器占用的资源。

utilisation FilterConfig

La méthode init de filtre fournit un objet FilterConfig.

configuration de fichier Web.xml comme suit:

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

Utilisez l'objet FilterConfig pour obtenir les paramètres de la méthode init:

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

instance de filtre Servlet

Ce qui suit sont des exemples de filtres de servlet, le nom de sortie et adresse du site Web. Les exemples Servlet pour vous donner une compréhension de base du filtre, vous pouvez utiliser le même concept pour écrire des applications de filtrage plus complexes:

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

Ici, l'utilisation du DisplayHeader.java mentionné précédemment à titre d'exemple:

//导入必需的 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 le mappage de filtre Servlet (Mapping Filter Servlet)

Définir les filtres, puis mappés à une URL ou Servlet, qui définissent la Servlet, puis mappés à un modèle d'URL de la même façon. Créer l'entrée suivante pour la balise de filtre dans le fichier descripteur de déploiementweb.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>  

Le filtre applique à tous les Servlet, parce que nous avons spécifié dans la configuration/ *.Si vous souhaitez appliquer un filtre sur un petit nombre de Servlet, vous pouvez spécifier un chemin de Servlet spécifique.

Maintenant, essayez la manière habituelle pour appeler un servlet, vous verrez les journaux de serveur Web générés. Vous pouvez également utiliser l'enregistreur à l'enregistrement de Log4J ci-dessus dans un fichier séparé.

Ensuite , nous visitons cette adresse par exemple http: // localhost: 8080 / TomcatTest / DisplayHeader, puis regardez à la sortie de la console, comme suit:

En utilisant une pluralité de filtres

Les applications Web peuvent être de plusieurs filtres différents en fonction de l'objectif spécifique défini. Supposons que vous avez défini deux filtresAuthenFilteretLogFilter.Vous devez créer un mappage différent décrit ci-dessous, et au-dessus du reste du processus est sensiblement la même explication:

<Filtre>
   <Filtre-name> LogFilter </ filter-name>
   <Filtre-class> com.w3big.test.LogFilter </ filter-class>
   <Init-param>
	  <Param-name> Test-param </ param-name>
	  <Param-value> Initialisation paramter </ param-value>
   </ Init-param>
</ Filtre>

<Filtre>
   <Filtre-name> AuthenFilter </ filter-name>
   <Filtre-class> com.w3big.test.AuthenFilter </ filter-class>
   <Init-param>
	  <Param-name> Test-param </ param-name>
	  <Param-value> Initialisation paramter </ param-value>
   </ Init-param>
</ Filtre>

<Filter-mapping>
   <Filtre-name> LogFilter </ filter-name>
   <Url-pattern> / * </ url-pattern>
</ Filter-mapping>

<Filter-mapping>
   <Filtre-name> AuthenFilter </ filter-name>
   <Url-pattern> / * </ url-pattern>
</ Filter-mapping>

Les filtres sont appliqués séquentiellement

Commander un élément web.xml filter-mapping détermine le conteneur Web pour appliquer des filtres à l'ordre du Servlet. Pour inverser l'ordre du filtre, il vous suffit d'inverser l'élément filter-mapping dans le fichier web.xml.

Par exemple, l'exemple ci-dessus sera le premier LogFilter d'application, puis appliquer AuthenFilter, mais les exemples suivants inverser cet ordre:

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

instructions de configuration web.xml pour chaque noeud

  • <filter> Spécifie un filtre.
    • <filter-name> est utilisé pour spécifier un nom pour le filtre, le contenu de l'élément ne peut pas être vide.
    • <filter-class> élément est utilisé pour spécifier le nom de classe complet du filtre.
    • <init-param> élément est utilisé pour spécifier les paramètres d'initialisation du filtre, ses éléments enfants <param-name> spécifie le nom du paramètre, <param-value> paramètres de valeur spécifiée.
    • Dans le filtre, vous pouvez utiliser FilterConfig objet d'interface pour accéder aux paramètres d'initialisation.
  • <filter-mapping> élément est utilisé pour définir une ressource de filtre responsable intercepté. Filtre intercepter une ressource peut être spécifiée de deux manières: le nom demande chemin de Servlet et l'accès aux ressources
    • <filter-name> élément enfant est utilisé pour définir le nom enregistré du filtre. La valeur doit être dans les <filter> déclarations d'élément dans le nom du filtre à travers
    • <url-pattern> régler le filtre intercepté demande chemin (style URL associé du filtre)
  • <servlet-name> Spécifie le filtre bloqué nom Servlet.
  • <dispatcher> spécifier le filtre des ressources interceptées sont appelés conteneurs Servlet, qui peut être REQUEST , INCLUDE , FORWARD et ERROR une Défaillance REQUEST . Les utilisateurs peuvent configurer plusieurs <dispatcher> sous-élément est utilisé pour spécifier le filtre de ressources multiples façons d'intercepter les appels.
  • <dispatcher> valeur et l' importance des sous-éléments qui peuvent être mis en
    • REQUEST : Lorsque l'utilisateur un accès direct aux pages, conteneur Web appellera le filtre. Si la cible est une méthode pour accéder à la ressource, le filtre ne sera pas appelé par include () ou l'attaquant de l'RequestDispatcher ().
    • INCLUDE : Si la ressource cible est accessible via de l'RequestDispatcher include (), le filtre sera appelé. En outre, les filtres ne seront pas appelés.
    • FORWARD : Si la ressource cible est accessible via un RequestDispatcher forward () méthode, le filtre sera appelé, en outre, le filtre ne sera pas appelé.
    • ERROR : Si la ressource cible est à travers le mécanisme de gestion des exceptions déclarative appelé, puis le filtre sera appelé. En outre, le filtre ne sera pas appelé.