WebSphere 7.0 не запускает фильтр для корневого URL

У меня есть файл WAR, который определяет фильтр для всех URL-адресов:

<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app/ctxroot3.dtd">
...
<filter>
    <filter-name>OurRedirectServletFilter</filter-name>
    <filter-class>com.mycompany.RedirectServletFilter</filter-class>
</filter>
...
<filter-mapping>
    <filter-name>OurRedirectServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Фильтр предназначен для выполнения некоторых перенаправлений с «удобных» URL-адресов на соответствующий «фактический» URL-адрес, но я не думаю, что это действительно имеет отношение к проблеме.

В WebSphere 7.0 этот фильтр не работает для запросов к корневому URL-адресу, например. /ctxroot или /ctxroot/; вместо этого я просто получаю ответ 404. Он работает для /ctxroot/blah независимо от того, является ли blah допустимым или недопустимым путем.

Я пытался добавить дополнительные сопоставления фильтров для шаблонов URL <url-pattern>/</url-pattern> и <url-pattern></url-pattern>, но получаю такое же поведение.

Я тестировал на базе WAS 7.0.0.0 с последним пакетом исправлений, т. е. WAS 7.0.0.27.

Фильтр работает, как и ожидалось, в WAS 8.5, и я уверен, что в WAS 8.0, а также во всех версиях WebLogic, JBoss и Tomcat, которые я пробовал. Тогда это кажется ошибкой с WAS 7.0, но я все же хотел бы найти обходной путь. Кто-нибудь знает об одном?


person Aron    schedule 13.05.2013    source источник


Ответы (1)


В конце концов я просмотрел тело ответа об ошибке 404 и увидел код ошибки SRVE0190E, что привело меня к эту полезную страницу. Проблема в том, что фильтры не вызываются по умолчанию для URL-адресов, соответствующих несуществующим ресурсам (хотя я клянусь, что проверил это для URL-адреса, отличного от корня контекста, и мой фильтр был вызван).

В этой ситуации можно настроить WebSphere для вызова фильтров, задав настраиваемое свойство, как описано на связанной странице:

com.ibm.ws.webcontainer.invokefilterscompatibility=true

Я также обнаружил, что в случае корневого URL-адреса контекста установка записи welcome-file в web.xml, которая сопоставляется с существующим ресурсом, вызывает вызов фильтра:

<welcome-file-list>
    <welcome-file>fakehome.html</welcome-file>
</welcome-file-list>
person Aron    schedule 14.05.2013