Я использую Atmosphere 1.0.15 для обработки push-уведомлений под Tomcat, и он работает отлично уже несколько лет. Недавно я добавил простой фильтр в Tomcat в качестве теста, который (в настоящее время) только регистрирует входящий URL-адрес и продолжается. Проблема в том, что фильтр, по-видимому, просто не вызывается Tomcat для любого пути сервлета, который обрабатывается моей атмосферой, но фильтр вызывается просто отлично для любого другого пути сервлетов.Фильтр Tomcat не используется для сервлета атмосферы
Вот соответствующая часть моей web.xml:
<servlet>
<description>AtmosphereServlet</description>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<init-param>
<param-name>org.atmosphere.atmosphereDotXml</param-name>
<param-value>WEB-INF/config/atmosphere.xml</param-value>
</init-param>
<!-- Reduce memory usage by sharing ExecutorServices -->
<init-param>
<param-name>org.atmosphere.cpr.broadcaster.shareableThreadPool</param-name>
<param-value>true</param-value>
</init-param>
<!-- Automatically free Broadcaster objects when the last client on the Broadcaster's channel disconnects -->
<init-param>
<param-name>org.atmosphere.cpr.broadcasterLifeCyclePolicy</param-name>
<param-value>EMPTY_DESTROY</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AtmosphereServlet</servlet-name>
<url-pattern>/atmosphere/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>
com.foobar.MyFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Вот мой atmosphere.xml:
<atmosphere-handlers>
<atmosphere-handler context-root="/atmosphere/client-notification"
class-name="com.foobar.MyClientNotificationAtmosphereHandler"
comet-support="org.atmosphere.container.Tomcat7CometSupport">
</atmosphere-handler>
</atmosphere-handlers>
Вот странная вещь: если я ударил любой URL кроме для один под/атмосфера, мой фильтр вызывается. Например, это работает отлично, и мой фильтр вызывается:
... Однако для этого URL (или любого другого URL в каталоге/атмосфера), мой фильтр не вызывается для любого из них:
https://myserver:444/atmosphere/client-notification
https://myserver:444/atmosphere
https://myserver:444/atmosphere/foobar
Моя первая мысль была о том, что URL-шаблон был выключен, но он установлен в «/ *», и мой фильтр вызывается для любых других URL-адресов, кроме тех, при/атмосферы. Я также попытался установить URL-адрес явным образом:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/atmosphere/client-notification</url-pattern>
</filter-mapping>
... но все еще нет кубиков. Я что-то упускаю?? Возможно ли, чтобы Atmosphere предотвратила запуск фильтров? Насколько я понимаю, фильтры всегда вызывают перед сервлетом, поэтому фильтр может «обернуть» вызов.
Любые советы очень ценятся!