Spring: разность /** и/* относительно путей
Какая разница между двумя звездочками вместо одной звездочки, когда мы ссылаемся на пути?
Ранее я отлаживал свой проект Spring 3. Я пытался добавить .swf, используя
<spring:url var="flashy" value="/resources/images/flash.swf"/>
С моим web.xml ResourceServlet, похожим на
<servlet-name>Resource Servlet </servlet-name>
<url-pattern>/resources/*</url-pattern>
Но, к сожалению, я получал эту ошибку:
WARN org.springframework.js.resources.ResourceServlet - An attempt to access a protected resource at /images/flash.swf was disallowed.
Мне показалось, что это действительно странно, поскольку все мои изображения в папке images
были доступны, но как мой .swf был "защищен"?
Впоследствии я решил изменить /resources/*
на /resources/**
, и он наконец-то сработал. Мой вопрос: почему?
Ответы
Ответ 1
- Звездочка
('*')
соответствует нулю или нескольким символам, вплоть до появления символа '/'
(который служит в качестве разделителя путей). Строка, такая как "/abcd/docs/index.html"
, не будет успешно соответствовать шаблону '/\*/\*.index.html'
. Первая звездочка соответствует только первому разделителю пути, в результате получается строка "abcd"
. Успешный шаблон соответствия будет '/\*/\*/\*.html'
.
- Строка, содержащая две звездочки
('\*\*')
, соответствует нолю или нескольким символам. Сюда может входить разделитель путей '/'
. В этом случае "/abcd/docs/index.html"
будет успешно соответствовать шаблону '/\*\*/\*.html'
. Двойная звездочка, включая разделитель путей, будет соответствовать строке "abcd/docs".
Надеюсь, что это поможет!
Ответ 2
Это шаблон пути, который используется в команде Apache ant
, spring, реализует его и использует его во всей структуре.
Для справки см. javadoc AntPathMatcher (новейший javadoc, похоже, имеет проблему, поэтому я ссылку старого).
Возвращаясь к вашей проблеме, в соответствии с документом, у нее есть только 3 правила:
-
?
соответствует одному символу
-
*
соответствует нулю или нескольким символам
-
**
соответствует нулю или более "каталогам" в пути