Вам не нужно менять логику вашего пользовательского фильтра, когда вы сопоставляете его в 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
Filter
с помощью шаблона URL, который охватывает только страницы JSF. - person Tiny   schedule 24.03.2015