C'est la combinaison de ces trois propriétés qui fait du filtre un composant parfaitement adapté à tous les traitements de masse, nécessitant d'être appliqués systématiquement à tout ou partie des pages d'une application. À titre d'exemple, on peut citer les usages suivants : l'authentification des visiteurs, la génération de logs, la conversion d'images, la compression de données ou encore le chiffrement de données.
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ExempleFilter implements Filter {
public void init( FilterConfig config ) throws ServletException {
// Cycle de vie du filtre
// Lors de l'instanciation, la méthode init() est appelée par le conteneur.
// Si vous souhaitez passer des paramètres d'initialisation au filtre, vous pouvez alors les récupérer depuis l'objet FilterConfig passé en argument à la méthode.
}
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
// La méthode qui va contenir les traitements effectués par le filtre.
// Une fois les traitements appliqués, soit vous appelez la méthode doFilter() de l'objet FilterChain pour passer au filtre suivant dans la liste,
// soit vous effectuez une redirection ou un forwarding pour changer la destination d'origine de la requête.
}
public void destroy() {
// Cycle de vie du filtre
}
}
Tout comme une servlet, un filtre doit être déclaré dans le fichier web.xml de l'application pour être reconnu.
Si vous souhaitez qu'un filtre soit appliqué avant un autre, placez son mapping avant le mapping du second dans le fichier web.xml de votre application.
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
...
<filter>
<filter-name>Exemple</filter-name>
<filter-class>package.ExempleFilter</filter-class>
</filter>
<filter>
<filter-name>SecondExemple</filter-name>
<filter-class>package.SecondExempleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Exemple</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SecondExemple</filter-name>
<url-pattern>/page</url-pattern>
</filter-mapping>
...
</web-app>
Un filtre ne se décleche par défaut que pour une requète HTTP.
Un filtre peut s'appliquer à un forwarding ou à un include avec la balise <dispatcher>
.
<filter-mapping>
<filter-name>RestrictionFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>