Сопоставление URL-адресов фильтра сервлетов

Как можно сопоставить фильтр с корнем URL-адреса? Я использую Tomcat 7.0.2 и развертываю приложение как ROOT.war. Страница приветствия - sign_in.xhtml. Я хотел бы запускать фильтр всякий раз, когда клиент отправляет запрос на корень сайта (т.е. только доменное имя) или когда клиент запрашивает sign_in.xhtml. Вот что у меня есть на данный момент:

  <filter>
        <filter-name>My filter</filter-name>
        <filter-class>com.myApp.myFilter</filter-class>        
    </filter>
    <filter-mapping>
        <filter-name>My filter</filter-name>
        <url-pattern>/sign_in.xhtml</url-pattern>
    </filter-mapping>

Запросы на sign_in.xhtml напрямую, успешно вызывают фильтр, но я не уверен, как получить запросы от корня для вызова фильтра. Согласно спецификации сервлета (версия 3.0)

<url-pattern>/</url-pattern>

сопоставляется с сервлетом по умолчанию, а пустая строка сопоставляется с корнем. Вот соответствующий раздел из спецификации:

«Пустая строка (" ") - это специальный шаблон URL, который точно соответствует корню контекста приложения, то есть запросам формы http://host:port/ /. В этом случае информация о пути - '/', а путь сервлета и путь контекста - это пустая строка (««) ».

Однако оба следующих шаблона URL-адресов приводят к тому, что Tomcat генерирует исключение.

<url-pattern></url-pattern>
<url-pattern>""</url-pattern>

Я был бы очень признателен, если бы кто-нибудь мог пролить свет на это. Спасибо.

Андрей


person J. Andrew Laughlin    schedule 10.09.2010    source источник


Ответы (1)


<url-pattern>/</url-pattern> должен работать для запросов к корню. Вы пробовали это?

Если вы хотите фильтровать все запросы, вам следует использовать <url-pattern>/*</url-pattern>.


Обновление: чтобы исключить одно и другое, я протестировал url-pattern из / на Tomcat 7 (с использованием как web.xml, так и @WebFilter(urlPatterns={"/"})), и это действительно не сработало, как ожидалось. Однако url-pattern из / работает должным образом на Tomcat 6 (Servlet 2.5), а также на Glassfish v3 (Servlet 3.0). Я подозреваю ошибку в Tomcat 7, поэтому я сообщил о проблеме 49914. об этом.

person BalusC    schedule 10.09.2010
comment
Спасибо, что заглянули в этот BalusC. Я намерен принудительно перенаправить, если пользователю требуется изменить свой пароль. Фильтр кажется правильным решением. Думаю, придется дождаться 7.0.3 или придумать что-нибудь другое. Любые идеи? - person J. Andrew Laughlin; 11.09.2010
comment
Фильтр, прослушивающий /*, который выполняет действия, только если URI запроса пуст. - person BalusC; 11.09.2010
comment
Я попробую, а затем обновлю url-patten, как только ошибка Tomcat будет исправлена. - person J. Andrew Laughlin; 11.09.2010
comment
@Balus - теперь у меня точная проблема - я использую Tomcat7 и хочу перенаправить все вызовы с пустым URL-адресом запроса (www.mysite.com) на сервлет. Но если URI не пустой - он не должен направлять его сервлету. Я использую Tomcat 7.9.16 - как мне это сделать? - person Dejell; 07.07.2011
comment
@Odelya: Отобразите фильтр на /* и определите HttpServletRequest#getRequestURI() самостоятельно. Если URI пуст, отправьте / по RequestDispatcher#forward(), иначе просто продолжите цепочку фильтров. - person BalusC; 07.07.2011
comment
@Balus - как это влияет на производительность моего фильтра? - person Dejell; 07.07.2011
comment
@Odelya: Эта дополнительная if-else проверка? Это совершенно незначительно. - person BalusC; 07.07.2011
comment
@BalusC ‹* <url-pattern>/</url-pattern> должен работать для запросов к корню. ›› Нет, не работает для Tomcat 6 (Servlet 2.5). Есть какие-нибудь обновления по этой теме? - person Joseph Victor Zammit; 20.07.2012