Filtres Servlet pour l'Authentification et le Nettoyage de Contenu

Les filtres Servlet interceptent les requêtes HTTP pour appliquer des traitements avant l'accès aux ressources web. Voici l'implémentation de deux filtres typiques : un pour la gestion de l'authentification et un autre pour le remplacement de termes sensibles dans les données.

Filtre d'Authentification

Ce filtre vérifie si l'utilisateur est connecté en accédant à une session HTTP. Les chemins d'accès publics sont exclus de la vérification. La classe implémente l'interface javax.servlet.Filter et utilise une collection pour stocker les pages autorisées sans authentfiication.


package com.exemple.web.filters;

import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class AuthFilter implements Filter {
    private Set<String> publicPaths = new HashSet<>();

    @Override
    public void init(FilterConfig config) throws ServletException {
        String pathsParam = config.getInitParameter("publicPaths");
        if (pathsParam != null) {
            String[] pathsArray = pathsParam.split(",");
            publicPaths.addAll(Arrays.asList(pathsArray));
        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        HttpServletResponse httpRes = (HttpServletResponse) res;
        httpReq.setCharacterEncoding("UTF-8");
        httpRes.setCharacterEncoding("UTF-8");

        HttpSession session = httpReq.getSession(false);
        String requestUri = httpReq.getRequestURI();
        String contextPath = httpReq.getContextPath();
        String relativePath = requestUri.substring(contextPath.length());

        if (!publicPaths.contains(relativePath)) {
            if (session == null || session.getAttribute("currentUser") == null) {
                httpRes.sendRedirect(httpReq.getContextPath() + "/login.jsp");
                return;
            }
        }
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
        // Ressources à libérer si nécessaire
    }
}

Configuration dans le fichier web.xml :


<filter>
    <filter-name>AuthentificationFiltre</filter-name>
    <filter-class>com.exemple.web.filters.AuthFilter</filter-class>
    <init-param>
        <param-name>publicPaths</param-name>
        <param-value>/login.jsp,/register</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>AuthentificationFiltre</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filtre de Nettoyage de Contenu

Ce filtre remplace des termes interdits par des astérisques dans les paramètres de requête. Il utilise un wrapper personnalisé pour la requête afin de modifier le comportement de getParameter.


package com.exemple.web.filters;

import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ProfanityFilter implements Filter {
    private List<String> bannedWords = new ArrayList<>();

    @Override
    public void init(FilterConfig config) throws ServletException {
        String wordsParam = config.getInitParameter("bannedWords");
        if (wordsParam != null) {
            String[] wordsArray = wordsParam.split(",");
            bannedWords.addAll(Arrays.asList(wordsArray));
        }
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) req;
        SanitizedRequest sanitizedReq = new SanitizedRequest(httpReq);
        chain.doFilter(sanitizedReq, res);
    }

    @Override
    public void destroy() {
        // Ressources à libérer si nécessaire
    }

    private class SanitizedRequest extends HttpServletRequestWrapper {
        private final HttpServletRequest originalRequest;

        public SanitizedRequest(HttpServletRequest request) {
            super(request);
            this.originalRequest = request;
        }

        @Override
        public String getParameter(String name) {
            String value = originalRequest.getParameter(name);
            if (value != null && name.equals("content")) {
                for (String word : bannedWords) {
                    value = value.replaceAll(word, "***");
                }
            }
            return value;
        }
    }
}

Configuration dans web.xml :


<filter>
    <filter-name>ContenuFiltre</filter-name>
    <filter-class>com.exemple.web.filters.ProfanityFilter</filter-class>
    <init-param>
        <param-name>bannedWords</param-name>
        <param-value>mot1,mot2,mot3</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ContenuFiltre</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Exemple de page JSP pour tester le filtre :


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
    <meta charset="UTF-8">
    <title>Test de Filtre</title>
</head>
<body>
    <form action="result.jsp" method="post">
        <textarea name="content" rows="4" cols="40">Texte avec mot1 et mot2 à filtrer.</textarea>
        <input type="submit" value="Envoyer">
    </form>
</body>
</html>


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
    <meta charset="UTF-8">
    <title>Résultat</title>
</head>
<body>
    Contenu filtré : ${param.content}
</body>
</html>

Étiquettes: Java Servlet Filtre HTTP javax.servlet Configuration XML JSP

Publié le 27 juillet à 10h39