92 votes

Printemps : Différence de /** et /* par rapport aux chemins d'accès

Quelle est la différence entre deux astérisques et un astérisque lorsque l'on parle de chemins ?

Plus tôt, je déboguais mon projet Spring 3. J'essayais d'ajouter un .swf en utilisant la fonction

<spring:url var="flashy" value="/resources/images/flash.swf"/>

Le ResourceServlet de mon web.xml ressemble à ceci

<servlet-name>Resource Servlet </servlet-name>
<url-pattern>/resources/*</url-pattern>

Mais malheureusement, j'ai obtenu cette erreur :

WARN org.springframework.js.resources.ResourceServlet - An attempt to access a protected resource at /images/flash.swf was disallowed.

J'ai trouvé cela vraiment étrange, car toutes mes images dans l'application images ont été accédés mais comment se fait-il que mon .swf soit "protégé" ?

Par la suite, j'ai décidé de changer le /resources/* a /resources/** et ça a finalement marché. Ma question est... pourquoi ?

63voto

Rangi Lin Points 3636

Il s'agit d'un schéma de cheminement qui est utilisé dans Apache Ant bibliothèque. L'équipe de Spring l'implémente et l'utilise dans tout le framework.


Revenons à votre problème. Selon la Javadoc de AntPathMatcher il n'y a que 3 règles :

  1. ? correspond à un caractère
  2. * correspond à zéro ou plusieurs caractères
  3. ** correspond à zéro ou plusieurs 'répertoires' dans un chemin d'accès

MISE À JOUR 2022

Dans les dernières versions de Spring Framework, il existe une quatrième règle :

  1. {spring:[a-z]+} correspond à la regexp [a-z]+ comme une variable de chemin nommée "spring"

Voir les détails dans la dernière version (à ce jour) de Spring Framework. version 5 Javadoc : AntPathMathcer .

26voto

Anshu Points 7149
  • Un astérisque ('*') correspond à zéro ou plusieurs caractères, jusqu'à l'occurrence d'un caractère '/' (qui sert de séparateur de chemin). Une chaîne de caractères telle que "/abcd/docs/index.html" ne peut pas être comparée au motif "/*/*.index.html". Le premier astérisque ne correspond que jusqu'au premier séparateur de chemin, ce qui donne la chaîne "abcd". Un modèle de correspondance réussi serait '/*/*/*.html'.
  • Une chaîne contenant deux astérisques ('**') correspond à zéro ou plusieurs caractères. Cela peut inclure le séparateur de chemin '/'. Dans ce cas, "/abcd/docs/index.html" correspondrait au motif "/**/*.html". Le double astérisque, y compris le séparateur de chemin, correspondrait à la chaîne "abcd/docs".

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X