Monday, August 22, 2011

Ajouter un filtre de Servlet lors du déploiement d'un WAR

Les annotations et le support de Comet font partie des apports les plus intéressants de la version 3.0 des servlets et par conséquent de Java EE 6. Une des conséquences directes de l'utilisation d'annotations, est qu'ajouter un filtre de servlets à l'archive d'un projet web .war, ne nécessite plus de mettre à jour le fichier web.xml. Ca devient donc d'une facilité déconcertante de développer vos filtres dans un autre projet, de les regrouper dans un fichier d'archive et de les intégrer juste avant le déploiement.
Voici un exemple de filtre de servlets comme vous pouvez la développer à partir de la version 3.0; vous reconnaîtrez l'annotation WebFilter qui indique ici que le filtre s'applique à toutes les servlets et JSP du projet. Evidemment ce cas est très simple et sans intérêt. Vous pourrez, par contre, utiliser cette approche pour mesurer des temps de réponse ou déployer et alimenter un MBean JMX :
package com.arkzoyd.fdemo;

import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(urlPatterns={"/*"})
public class oops implements Filter {
    
    public oops() {
    }    
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
       chain.doFilter(request, response);        
       response.getWriter().print("<div style=\"FONT-SIZE: x-small;\">"+
                                  (new Date()).toString()+"</div>");
    }

    @Override
    public void destroy() {     
    }

    @Override
    public void init(FilterConfig filterConfig) {     
    }
}
Une fois votre filtre développé, faîtes-en un fichier d'archive java (.jar) plutôt qu'une archive de projet web (.war). Pour intégrer votre filtre de servlet et tout le code qui vous intéresse à votre application, il suffit alors simplement de l'intégrer à votre application Web en ajoutant votre archive java, ici le fichier FilterJar.jar dans le répertoire WEB-INF/lib de votre archive web. Voici comment j'ai fait dans mon contexte :
$ mkdir -p WEB-INF/lib
$ cp $PATH_TO_JAR/FilterJar.jar WEB-INF/lib/.
$ jar -uvf FilterDemo.war WEB-INF
adding: WEB-INF/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/lib/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/lib/FilterJar.jar(in = 2412) (out= 1100)(deflated 54%)

$ jar tvf FilterDemo.war
     0 Mon Aug 22 12:39:38 CEST 2011 META-INF/
   106 Mon Aug 22 12:39:36 CEST 2011 META-INF/MANIFEST.MF
     0 Mon Aug 22 12:40:02 CEST 2011 WEB-INF/
     0 Mon Aug 22 12:39:36 CEST 2011 WEB-INF/classes/
     0 Mon Aug 22 12:40:20 CEST 2011 WEB-INF/lib/
  2412 Mon Aug 22 12:40:20 CEST 2011 WEB-INF/lib/FilterJar.jar
   373 Mon Aug 22 12:39:36 CEST 2011 index.jsp
Redéployez votre application Web ; le filtre est bien actif :
Voilà un moyen très simple est portable d'instrumenter des applications Java EE 6 sans avoir à utiliser les outils spécifiques à votre plateforme... mis en oeuvre ici avec Glassfish 3.1.1

No comments:

Post a Comment