Difficultés avec default-servlet-handler dans Spring MVC et comparaison des approches pour les ressources statiques

Dans une application web Spring MVC, le DispatcherServlet est responsable du routage de toutes les requêtes HTTP, y compris celles destinées aux ressources statiques comme les fichiers CSS, JavaScript ou HTML. Cela conduit à des URLs contenant des suffixes tels que *.action ou *.do, par exemple http://localhost:8080/system/index.action. Pour uniformiser les styles d'URL, Spring propose des mécanismes spécifiques afin de gérer les ressources statiques sans ce suffixe, comme http://localhost:8080/html/index.html. Cependant, des problèmes de configuration peuvent survenir, notamment avec default-servlet-handler. Deux solutions principales existent pour résoudre ce problème.

Avant d'explorer les solutions, il est utile de rappeler la structure d'un projet web Spring MVC. Typiquement, les fichiers de ressources (JSP, CSS, JS) sont placés dans le dossier WEB-INF sous webapp. Ce répertoire offre une sécurité accrue, car son contenu n'est pas accessible directement par les clients sans configuration explicite.

Solution 1 : Utilisation de default-servlet-handler

Cette approche consiste à configurer le gestionnaire de servlet par défaut dans le fichier de configuration Spring MVC. En ajoutant la déclaration suivante :

<mvc:default-servlet-handler />

Cela définit un DefaultServletHttpRequestHandler qui redirige les requêtes de ressources statiques vers le DispatcherServlet. Toutefois, cette méthode présente une limitation : elle ne permet pas d'accéder aux fichiers situés dans le dossier WEB-INF, car le DispatcherServlet n'a pas les autorisations nécessaires pour servir ce répertoire protégé. Par exemple, une ressource à WEB-INF/css/style.css serait inaccessible via une URL comme http://localhost:8080/css/style.css. Cette configuration peut coexister avec d'autres solutions, mais son efficacité dépend de l'emplacement des fichiesr.

Solution 2 : Utilisation de la balise mvc:resources

Pour surmonter les limites de la première solution, il est recommandé d'utiliser la balise mvc:resources, qui mappe explicitement les chemins d'accès aux emplacemants physiques des ressources. Voici un exemple de configuration :

<mvc:resources mapping="/assets/**" location="/WEB-INF/static/" />

Dans cette configuration, l'attribut location désigne le répertoire racine des ressources, et mapping définit le motif d'URL correspondant. Ainsi, une requête vers http://localhost:8080/assets/image.png serait correctement routée vers le fichier WEB-INF/static/image.png. Cette méthode offre une flexibilité accrue et permet de gérer les ressources dans des répertoires protégés comme WEB-INF.

En pratique, la balise mvc:resources est plus adaptée pour les projets nécessitant un contrôle précis sur les chemins de ressources statiques. Elle évite les problèmes de permissions et offre une configuration plus claire et maintenable.

Étiquettes: spring-mvc dispatcher-servlet static-resources default-servlet-handler mvc-resources

Publié le 31 juillet à 11h20