2015-06-09 6 views
0

Я использую 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 кроме для один под/атмосфера, мой фильтр вызывается. Например, это работает отлично, и мой фильтр вызывается:

https://myserver:444/foo/bar

... Однако для этого 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 предотвратила запуск фильтров? Насколько я понимаю, фильтры всегда вызывают перед сервлетом, поэтому фильтр может «обернуть» вызов.

Любые советы очень ценятся!

ответ

0

Итак, после многократного поиска я выяснил проблему: поскольку класс AtmosphereServlet выполняет асинхронный ввод-вывод, он реализует интерфейс org.apache.catalina.comet.CometProcessor, и поэтому Tomcat не вызывает нормальную цепочку фильтров для него, поскольку это асинхронный сервлет. Вместо этого мой фильтр должен был реализовать интерфейс CometFilter, который может обрабатывать каждое событие Comet, поскольку длительный запрос остается активным.

Как только я понял, что CometProcessor был виновником я нашел подобный SO пост здесь: How do I get the requests for a servlet implementing CometProcessor interface to pass through a filter

Смежные вопросы