English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

处理 Cookie JSP

I filtri in JSP e Servlet sono classi Java.

I filtri possono intercettare dinamicamente richieste e risposte per trasformare o utilizzare le informazioni contenute in richieste o risposte.

Puoi aggiungere uno o più filtri a un Servlet o a un gruppo di Servlet. I filtri possono anche essere aggiunti ai file JavaServer Pages (JSP) e alle pagine HTML.

I filtri sono classi Java utilizzabili per la programmazione Servlet che possono raggiungere gli scopi seguenti:

  • Intercepta queste richieste prima che il client acceda alle risorse backend.

  • Elabora queste risposte prima di inviarle al client.

Vari tipi di filtri suggeriti dalle norme:

  • Filtri di autenticazione (Authentication Filters).

  • Filtri di compressione dei dati (Data compression Filters).

  • Filtri di crittografia (Encryption Filters).

  • Filtri che scatenano eventi di accesso alle risorse.

  • Filtri di conversione di immagine (Image Conversion Filters).

  • Filtri di registrazione e audit (Logging and Auditing Filters).

  • Filtri a catena MIME-TYPE (MIME-TYPE Chain Filters).

  • Filtri di tokenizzazione (Tokenizing Filters).

  • Filtri XSL/T (XSL/T Filters), trasformano il contenuto XML.

I filtri vengono dichiarati tramite i tag XML del descrrittore di部署 web (web.xml) e poi mappati al nome del Servlet o al modello di URL nel descrrittore di部署 dell'applicazione.

Quando il container web avvia l'applicazione web, crea un'istanza per ogni filtro dichiarato nel descrrittore di部署.

L'ordine di esecuzione dei Filter è lo stesso dell'ordine di configurazione nel file web.xml, generalmente si configura il Filter prima di tutti i Servlet.

Metodi del filtro Servlet

Il filtro è una classe Java che implementa l'interfaccia javax.servlet.Filter. L'interfaccia javax.servlet.Filter definisce tre metodi:

NumeroMetodo & Descrizione
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
Questo metodo esegue l'operazione di filtraggio effettiva, quando la 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.
2public void init(FilterConfig filterConfig)
Al lancio dell'applicazione web, il server web crea un esempio di oggetto Filter e chiama il metodo init, legge la configurazione web.xml, completa la funzione di inizializzazione dell'oggetto, preparandosi per intercettare le richieste degli utenti successive (l'oggetto filter viene creato una sola volta, il metodo init viene eseguito una sola volta). Gli sviluppatori possono ottenere l'oggetto FilterConfig che rappresenta le informazioni di configurazione del filter tramite i parametri del metodo init.
3public void destroy()
Il container Servlet chiama questo metodo prima di distruggere l'esempio del filtro, in questo metodo rilasciare le risorse occupate dal filtro Servlet.

FilterConfig utilizza

Il metodo init del filtro fornisce un oggetto FilterConfig.

Come configurato nel file web.xml come segue:

<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 i parametri di inizializzazione
    String site = config.getInitParameter("Site"); 
    // 输出初始化参数
    System.out.println("网站名称: " + site); 
}

Esempio di filtro JSP

Ecco un esempio di filtro Servlet, che visualizzerà il nome e l'indirizzo del sito web. Questo esempio ti dà una comprensione di base dei filtri Servlet, puoi utilizzare concetti simili per scrivere applicazioni di filtri più complesse:

//导入必需的 java 库
import javax.servlet.*;
import java.util.*;
// Implementare la classe Filter
public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // Ottenere i parametri di inizializzazione
        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 del Sito di Tutorial 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>");
    }
    // El metodo per gestire le richieste del metodo POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Mappatura del filtro Servlet in Web.xml

Definisci un filtro e mappalo a un URL o Servlet, il che è più o meno lo stesso di definire un Servlet e mapparlo a un modello di URL. Nel file descrittore di部署 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, perché abbiamo specificato /* 。Se desideri applicare i filtri solo a pochi Servlet, puoi specificare un percorso Servlet specifico.

Ora prova 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.

Quindi visitiamo questo indirizzo di esempio http://localhost:8080/TomcatTest/DisplayHeader, poi controlla il contenuto di output nel console

L'uso di più filtri

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 è più o meno 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>

Ordine di applicazione dei filtri

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

Spiegazione dei nodi di configurazione web.xml

  • L'elemento <filter> specifica un filtro.

    • L'elemento <filter-name> viene utilizzato per specificare un nome per il filtro. Il contenuto di questo elemento non può essere vuoto.

    • L'elemento <filter-class> viene utilizzato per specificare il nome completo della classe del filtro.

    • L'elemento <init-param> viene utilizzato per specificare i parametri di inizializzazione del filtro. Il sottoelemento <param-name> specifica il nome del parametro, mentre <param-value> specifica il valore del parametro.

    • Nell'filtro, è possibile utilizzare l'oggetto interfaccia FilterConfig per accedere ai parametri di inizializzazione.

  • L'elemento <filter-mapping> viene utilizzato per impostare le risorse gestite da un Filter. Le risorse gestite da un Filter possono essere specificate in due modi: il nome del Servlet e il percorso di accesso alla risorsa.

    • L'elemento <filter-name> viene utilizzato per impostare il nome di registrazione del filtro. Questo valore deve essere il nome di un filtro dichiarato nell'elemento <filter>.

    • 设置 filter 所拦截的请求路径(过滤器关联的URL样式)

  • <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()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。