4.6. Créer une valve personnalisée

Une Valve est une classe Java qui est insérée dans le pipeline de traitement de requête d'une application avant les filtres de servlet de l'application. Elle peut être utilisée pour modifier la demande ou pour un autre comportement. Cette tâche vous montre les étapes de base requises pour créer une valve.

Procédure 4.3. Créer une valve personnalisée

  1. Créer la classe Valve

    Créer une sous-classe de org.apache.catalina.valves.ValveBase.
    package org.jboss.samplevalves;
    
    import org.apache.catalina.valves.ValveBase;
    import org.apache.catalina.connector.Request;
    import org.apache.catalina.connector.Response;
    
    public class RestrictedUserAgentsValve extends ValveBase {
    
    }
  2. Mettre en place la méthode d'invocation

    La méthode invoke() est utilisée lorsque la valve est exécutée dans la pipeline. Les objets de requête et de réponse sont considérés comme des paramètres. Effectuer tout procédé et modification de requête et réponse ici.
    public void invoke(Request request, Response response)
    {
    
    }
  3. Invoquer la prochaine étape de pipeline

    La dernière étape que la méthode d'invocation doit effectuer est d'invoquer l'étape suivante de la pipeline et de transmettre les objets de requête et de réponse modifiés, en utilisant la méthode getNext().invoke().
    getNext().invoke(request, response);
  4. Option : indiquer les paramètres

    Si la valve doit être configurable, activer cette option en ajoutant un paramètre. Pour ce faire, il convient d'ajouter une variable d'instance et une méthode setter pour chaque paramètre.
    private String restrictedUserAgents = null;
    
    public void setRestricteduserAgents(String mystring) 
    {
       this.restrictedUserAgents = mystring;
    }

Exemple 4.4. Échantillon de valve personnalisée

package org.jboss.samplevalves;

import java.io.IOException;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import org.apache.catalina.valves.ValveBase;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;

public class RestrictedUserAgentsValve extends ValveBase 
{
    private String restrictedUserAgents = null;

    public void setRestrictedUserAgents(String mystring) 
    {
        this.restrictedUserAgents = mystring;
    }

    public void invoke(Request request, Response response) throws IOException, ServletException 
    {
      String agent = request.getHeader("User-Agent");
      System.out.println("user-agent: " + agent + " : " + restrictedUserAgents);
      if (Pattern.matches(restrictedUserAgents, agent)) 
      {
         System.out.println("user-agent: " + agent + " matches: " + restrictedUserAgents);
         response.addHeader("Connection", "close");
      }
      getNext().invoke(request, response);
    }
}