Предыдущие ответы верны в том, что шаблон URL может начинаться или заканчиваться только символом подстановки, и, следовательно, истинная сила регулярного выражения не может быть использована.
Однако я решил эту проблему в предыдущих проектах, создав простой фильтр по умолчанию, который перехватывает все запросы, и этот фильтр содержит регулярные выражения для определения необходимости применения дальнейшей логики. Я обнаружил, что при таком подходе снижение производительности было незначительным.
Ниже приведен простой пример, который можно улучшить, переместив шаблон регулярного выражения в атрибут фильтра.
Настройка фильтра в файле web.xml:
<filter>
<filter-name>SampleFilter</filter-name>
<filter-class>org.test.SampleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SampleFilter</filter-name>
<servlet-name>SampleServlet</servlet-name>
</filter-mapping>
<servlet-mapping>
<servlet-name>SampleServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Базовая реализация фильтра, которая может использовать любой шаблон регулярных выражений (извините, использует родительский класс Spring's OncePerRequestFilter):
public class SampleFilter extends OncePerRequestFilter {
@Override
final protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (applyLogic(request)) {
//Execute desired logic;
}
filterChain.doFilter(request, response);
}
protected boolean applyLogic(HttpServletRequest request) {
String path = StringUtils.removeStart(request.getRequestURI(), request.getContextPath());
return PatternMatchUtils.simpleMatch(new String[] { "/login" }, path);
}
}