Шаблон фильтра только для страниц JSF, а не для статических ресурсов при использовании перезаписи URL-адреса Tuckey

Я реализую фильтр для перенаправления просроченных пользователей на страницу пароля.

Я также использую переписывание URL-адресов Tuckey, чтобы скрыть расширение .xhtml.

Теперь моя проблема заключается в том, как мне настроить фильтр для фильтрации только страниц JSF, а не статических ресурсов?


person DD.    schedule 24.03.2015    source источник
comment
Расположите эти страницы JSF таким образом, чтобы вы могли сопоставить рассматриваемый Filter с помощью шаблона URL, который охватывает только страницы JSF.   -  person Tiny    schedule 24.03.2015
comment
@tiny это не очень надежный вариант.   -  person DD.    schedule 25.03.2015


Ответы (1)


Вам не нужно менять логику вашего пользовательского фильтра, когда вы сопоставляете его в web.xml после фильтра перезаписи URL, и он также явно отправляется на FORWARD. Таким образом, URL-адрес/URI входящего запроса будет просто оригинальным. Фильтры по умолчанию отправляются на REQUEST, и это приведет к пропуску попаданий, когда какой-либо другой фильтр перед цепочкой выполняет вызов RequestDispatcher#forward(), как это делает фильтр перезаписи URL.

<!-- Should be placed *after* URL rewrite filter. -->
<filter-mapping>
    <filter-name>yourLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Чтобы сделать его более конкретным, вы также можете просто подключить фильтр к определенному сервлету вместо шаблона URL. В приведенном ниже примере предполагается, что вы сопоставили FacesServlet с <servlet-name> из facesServlet (обратите внимание, что вам все равно нужно сохранить диспетчер переадресации):

<!-- Should be placed *after* URL rewrite filter. -->
<filter-mapping>
    <filter-name>yourLoginFilter</filter-name>
    <servlet-name>facesServlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

В любом случае обратите внимание, что если вы также хотите разрешить исходные URL-адреса (и, следовательно, вы не настроили фильтр перезаписи URL-адресов для перенаправления их на переписанный URL-адрес), вам необходимо явно указать диспетчер REQUEST, а также показано выше, иначе фильтр не будет работать, когда пользователь напрямую запрашивает страницу, используя исходный URL-адрес. Если вы не разрешаете исходные URL-адреса, просто удалите <dispatcher>REQUEST</dispatcher>.

Тем не менее, термин «статические ресурсы» в этом контексте несколько двусмыслен. Вы, конечно, имели в виду ресурсы CSS/JS/изображения, но указанные выше фильтры по-прежнему будут охватывать те, которые управляются JSF через <h:outputStylesheet>, <h:outputScript> и т. д., и все они имеют шаблон URL-адреса /javax.faces.resource/*. Лучше всего выполнить дополнительную проверку в фильтре URL-адреса запроса, как показано ниже:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");

    if (facesResourceRequest)) {
        chain.doFilter(request, response); // Skip JSF resources.
        return;
    }

    // Your original filter code here.
}

Смотрите также:

person BalusC    schedule 25.03.2015