использование красивых лиц с веб-фильтрами

Использование Tomcat 7 --- Primefaces 3.4.1 --- javax face 2.1.17 --- prettyfaces-jsf2 3.3.3

Я правильно настроил красивые лица в своем проекте, но мои веб-фильтры не работают с новыми URL-адресами, которые написаны красивыми лицами.

Вот пример довольно-config.xml

<url-mapping id="home">
    <pattern value="/home"/>
    <view-id value="/secure/homepage.xhtml"/>
</url-mapping>

<url-mapping id="register">
    <pattern value="/register"/>
    <view-id value="/public/register.xhtml"/>
</url-mapping>

<url-mapping id="welcome">
    <pattern value="/"/>
    <view-id value="/public/welcome.xhtml"/>
</url-mapping>

<url-mapping id="profile">
    <pattern value="/profile/#{userId}"/>
    <view-id value="/profile.xhtml"/>
</url-mapping>

страницы входа (приветствия) и регистрации находятся в «общедоступной» папке, а их веб-фильтр определяется аннотацией: @WebFilter("/public/*")

для моей домашней страницы в "защищенной" папке (точно в папке будет больше страниц), я также определил веб-фильтр и его аннотацию: @WebFilter("/secure/*)

красивые URL-адреса работают нормально, но эти фильтры работают только тогда, когда я пишу исходные URL-адреса.

1) Как я могу восстановить свои веб-фильтры?

2) Я также хочу заблокировать пользователя за ввод исходного URL-адреса. Я знаю, что красивые лица полностью скрывают исходные URL-адреса, но есть ли способ сделать это?

-- РЕШЕНО -- спасибо за BalusC

если вы определили свои фильтры с аннотациями, вы можете настроить параметры диспетчера, такие как

@WebFilter(urlPatterns = "/public/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})


person oko    schedule 25.03.2013    source источник


Ответы (1)


PrettyFaces использует, как и многие другие решения для перезаписи URL-адресов, RequestDispatcher#forward() для пересылки запроса на нужный целевой ресурс.

Фильтры сервлетов при отображении без каких-либо <dispatcher> по умолчанию прослушивают только «начальные» запросы, а не перенаправленные, включенные или ошибочные запросы.

Таким образом, когда вы сопоставляете другой фильтр сервлета в web.xml после фильтра PrettyFaces, он по умолчанию не будет запускаться, если только вы явно не установите <dispatcher> на FORWARD рядом со значением по умолчанию REQUEST (вы должны сохранить это один для случая, когда PrettyFaces на самом деле не нужно выполнять переадресацию).

<filter-mapping>
    ...
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Или, если вы используете @WebFilter в своих фильтрах, используйте атрибут dispatcherTypes:

@WebFilter(..., dispatcherTypes = { REQUEST, FORWARD })

В качестве альтернативы, если рассматриваемый фильтр никоим образом не меняет цель запроса/ответа, например. установка кодировки, сжатие с помощью Gzip, прослушивание исключений и т. д., то вы также можете просто поместить ее перед кодировкой PrettyFaces.

person BalusC    schedule 25.03.2013
comment
Я не указал фильтр в моем web.xml, BalusC. Потому что я использую версию = 3.0, и довольно автоматически настраивается, как написано в документах. Также мои веб-фильтры четко определены с помощью аннотаций. Должен ли я определить его непосредственно в web.xml для настроек диспетчера? - person oko; 25.03.2013
comment
спасибо @BalusC, это работает очень хорошо. @WebFilter(urlPatterns = /public/*, dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}) решил мою проблему. Но я хочу задать второстепенный вопрос, обновляя или обновляя одну и ту же страницу (например, используя опрос Primefaces), который всегда улавливается фильтрами, и на самом деле это совершенно нормально. Но есть ли способ избежать этого? - person oko; 25.03.2013
comment
Вы можете сопоставить фильтр с более конкретным шаблоном URL. В качестве альтернативы, если вас беспокоит только то, что фильтр выполняет относительно дорогостоящую работу, вы также можете предварительно проверить, является ли это запросом JSF ajax, добавив if ("partial/ajax".equals(request.getHeader("Faces-Request"))) для быстрого пропуска всего задания фильтра (просто вызовите FilterChain#doFilter()). - person BalusC; 25.03.2013
comment
Я понял друг, проверю. Еще раз спасибо. - person oko; 25.03.2013