Filtrage d'une requête

Comme nous l'avons vu, un filtre peut être utilisé pour valider ou modifier une requête, ou une réponse. Commençons par examiner la façon dont on peut agir sur la requête.

Écrivons par exemple un filtre simple, qui enregistre les paramètres de la requête pour toutes les servlets de notre application.

Exemple 4.3. Filtrage d'une requête pour de la journalisation

public class LoggerFilter implements Filter {

   private static Logger logger = Logger.getLogger(LoggerFilter.class) ;

   // méthodes init() et destroy()   
   
   private void beforeProcessing(ServletRequest request, ServletResponse response) 
   throws IOException, ServletException {
   
       HttpServletRequest httpRequest = (HttpServletRequest)request ;
       String host = httpRequest.getRemoteHost() ;
       String url = httpRequest.getRequestURL().toString() ;

       logger.debug("L'hôte [" + host + "] fait une requête sur [" + url + "]") ;
      
   }
   
   public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain)
   throws IOException, ServletException {
   
      beforeProcessing(request, response) ;
      filterChain.doFilter(request, response) ;
   }
}

La mise en place ici est très simple : il s'agit juste d'enregistrer les informations du client qui a soumis cette requête.

On peut aussi interdire l'accès à une ressource, comme dans l'exemple suivant.

Exemple 4.4. Filtrage d'une requête avec validation de sécurité

public class LoggerFilter implements Filter {

   // méthodes init() et destroy()   
   
   public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain)
   throws IOException, ServletException {
   
      if (request.isUserInRole("admin")) {
      
         // l'utilisateur a été identifié comme étant un administrateur
         // il est autorisé à accéder à la servlet filtrée
         filterChain.doFilter(request, response) ;
         
      } else {
      
         // l'utilisateur n'est pas authentifié correctement
         // on le redirige vers une page d'erreur
         RequestDispatcher requestDispatcher = 
            request.getRequestDispatcher("/userNotAdmin.jsp") ;
         requestDispatcher.forward(request, response) ;
      }
   }
}