English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il filtro Servlet può intercettare dinamicamente richieste e risposte per trasformare o utilizzare informazioni contenute nella richiesta o nella risposta.
Può aggiungere uno o più filtri Servlet a un Servlet o a un gruppo di Servlet. I filtri Servlet possono anche essere aggiunti a file JavaServer Pages (JSP) e pagine HTML. Vengono chiamati tutti i filtri Servlet aggiunti prima di chiamare il Servlet.
Il filtro Servlet è una classe Java utilizzabile per la programmazione Servlet, che può servire a:
Intercepta queste richieste prima che il client acceda alle risorse di back-end.
Elabora queste risposte prima che vengano inviate al client.
Tipi di filtri suggeriti dalle specifiche:
Filtro di autenticazione (Authentication Filters).
Filtro di compressione dei dati (Data compression Filters).
Filtro di crittografia (Encryption Filters).
Filtro che genera eventi di accesso alle risorse.
Filtro di conversione di immagini (Image Conversion Filters).
Filtro di registrazione e audit (Logging and Auditing Filters).
Filtro a catena MIME-TYPE (MIME-TYPE Chain Filters).
Filtro di tokenizzazione (Tokenizing Filters).
Filtro XSL/T (XSL/T Filters), che trasforma il contenuto XML.
Il filtro viene dichiarato tramite etichette XML nel file di descrizione del部署 (web.xml) e poi mappato al nome del Servlet o al modello di URL nella descrizione del deployment dell'applicazione.
Quando il container web avvia l'applicazione web, crea un'istanza per ogni filtro dichiarato nel file di descrizione del部署 (web.xml).
L'ordine di esecuzione del filtro corrisponde all'ordine di configurazione nel file web.xml, di solito il filtro viene configurato prima di tutti i Servlet.
Il filtro è una classe Java che implementa l'interfaccia javax.servlet.Filter. L'interfaccia javax.servlet.Filter definisce tre metodi:
Numero di sequenza | Numero & Descrizione |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) Questo metodo esegue l'operazione di filtraggio effettiva, quando il metodo di richiesta del client corrisponde all'URL impostato dal filtro, il container Servlet chiama prima il metodo doFilter del filtro. FilterChain viene utilizzato per accedere ai filtri successivi. |
2 | public void init(FilterConfig filterConfig) Allo avvio dell'applicazione web, il server web crea un esempio di filtro e chiama il metodo init, legge la configurazione web.xml, completa la funzione di inizializzazione dell'oggetto, preparandosi per intercettare le richieste utente future (l'oggetto filtro viene creato una sola volta, e il metodo init viene eseguito una sola volta). Gli sviluppatori possono ottenere l'oggetto FilterConfig che rappresenta le informazioni di configurazione del filtro tramite i parametri del metodo init. |
3 | public void destroy() Il container Servlet chiama questo metodo prima di distruggere l'esempio del filtro, dove viene liberato la risorsa utilizzata dal filtro Servlet. |
Il metodo init del filtro fornisce un oggetto FilterConfig.
Come configurato nel file web.xml, ad esempio:
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.w3codebox.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>Base Tutorial Website</param-value> </init-param> </filter>
Utilizzare l'oggetto FilterConfig per ottenere i parametri nel metodo init:
public void init(FilterConfig config) throws ServletException { // Ottenere il parametro inizializzato String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " + site); }
Ecco un esempio di filtro Servlet, che visualizzerà il nome del sito e l'indirizzo. Questo esempio vi darà una comprensione di base dei filtri Servlet, che potete utilizzare per scrivere applicazioni di filtri più complesse:
package com.w3codebox.test; //导入必需的 java 库 import javax.servlet.*; import java.util.*; // Implementare la classe Filter public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // Ottenere il parametro inizializzato 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://it.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 = "Esempio di richiesta Header HTTP - Esempio di tutorial di base"; 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>Nome Header</th><th>Valore 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>"); } // Gestisce la richiesta di metodo POST public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Definisci un filtro e mappalo a un URL o Servlet, il che è più o meno lo stesso di definire un Servlet e mapparlo a uno schema di URL. Nel file descrittore di distribuzione web.xml Crea la seguente voce per il tag filter nel
<?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>Base Tutorial Website</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- Nome della classe --> <servlet-name>DisplayHeader</servlet-name> <!-- Pacchetto in cui si trova --> <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class> </servlet> <servlet-mapping> <servlet-name>DisplayHeader</servlet-name> <!-- Indirizzo visitato --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
Questi filtri si applicano a tutti i Servlet, poiché abbiamo specificato /* . Se desideri applicare i filtri solo a un numero limitato di Servlet, puoi specificare un percorso Servlet specifico.
Ora proviamo a chiamare qualsiasi Servlet in modo comune, vedrai i log generati nel server Web. Puoi anche utilizzare il registratore Log4J per registrare i log sopra menzionati in un file separato.
Procediamo a visitare questo indirizzo di esempio http://localhost:8080/TomcatTest/DisplayHeader, quindi controlla il contenuto di output nel console, come segue:
Le applicazioni Web possono definire diversi filtri per scopi specifici. Supponiamo che tu abbia definito due filtri AuthenFilter e LogFilter. È necessario creare una mappatura diversa come descritto di seguito, il resto del processo è generalmente lo stesso:
<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 Parameter</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 Parameter</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>
L'ordine degli elementi <filter-mapping> nel file web.xml determina l'ordine con cui il container web applica i filtri ai Servlet. Per invertire l'ordine dei filtri, è sufficiente invertire l'ordine degli elementi <filter-mapping> nel file web.xml.
Ad esempio, nell'esempio sopra riportato, LogFilter viene applicato prima di AuthenFilter, ma nell'esempio seguente l'ordine è invertito:
<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> specifica un filtro.
<filter-name> viene utilizzato per specificare un nome per il filtro, il contenuto di questo elemento non può essere vuoto.
<filter-class> elemento viene utilizzato per specificare il nome completo della classe del filtro.
<init-param> elemento viene utilizzato per specificare i parametri di inizializzazione del filtro, il suo elemento figlio <param-name> specifica il nome del parametro, <param-value> specifica il valore del parametro.
Nel filtro, è possibile utilizzare l'oggetto interfaccia FilterConfig per accedere ai parametri di inizializzazione.
<filter-mapping> elemento viene utilizzato per impostare le risorse gestite da un Filter. Una risorsa gestita da un Filter può essere specificata in due modi: nome del Servlet e percorso di accesso alla risorsa.
<filter-name> elemento viene utilizzato per impostare il nome di registrazione del filter. Il valore deve essere il nome di un filtro dichiarato nell'elemento <filter>.
<url-pattern>设置filter所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定Filter对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。