当前位置: 首页 > 知识库问答 >
问题:

没有为大气servlet调用Tomcat过滤器

呼延靖
2023-03-14

我使用Atmosphere 1.0.15在Tomcat下处理推送通知,几年来一直运行良好。最近,我在Tomcat中添加了一个简单的过滤器作为测试,它(目前)只记录传入的URL并继续。问题在于,Tomcat似乎根本不会对my Atmosphere处理的任何servlet路径调用过滤器,但对任何其他servlet路径调用过滤器都很好。

以下是我网站的相关部分。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>

这就是我的氛围。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>

奇怪的是:如果我点击了除/atmosphere下的URL之外的任何URL,就会调用我的过滤器。例如,这可以正常工作,并且调用了my filter:

https://myserver:444/foo/bar

...但是,对于此URL(或/atmosphere下的任何其他URL),我的筛选器不会针对以下任何一项调用:

https://myserver:444/atmosphere/client-notification
https://myserver:444/atmosphere 
https://myserver:444/atmosphere/foobar

我的第一个想法是,url模式是关闭的,但它被设置为“/*”,我的过滤器被调用,用于除/atmosphere下的url之外的任何其他url。我还尝试显式设置url模式:

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/atmosphere/client-notification</url-pattern>
</filter-mapping>

...但还是没有骰子。我错过了什么吗??大气有可能阻止过滤器在上面运行吗?据我所知,过滤器总是在servlet之前调用,所以过滤器可以“包装”对它的调用。

非常感谢您的建议!

共有1个答案

邹缪文
2023-03-14

因此,经过大量的挖掘,我发现了这个问题:由于AtmosphereServlet类执行异步I/O,它实现了Comet处理器接口org.apache.catalina.comet.,因此Tomcat不会为它调用正常的过滤器链,因为它是异步servlet。相反,我的过滤器必须实现CometFilter接口,该接口可以在长时间运行的请求保持活动状态时处理每个Comet事件。

一旦我发现Comet处理器是罪魁祸首,我在这里找到了一个类似的SO帖子:我如何让实现Comet处理器接口的servlet的请求通过过滤器

 类似资料:
  • 我正在研究一个合作医疗系统。 我的代码在url调用的servlet的

  • 大家好,我正在开发一个web应用程序,在调用web中提到的Servelet时遇到了问题。xml。 这是我的web.xml 问题是,当我试图运行我的应用程序时,我希望先运行身份验证过滤器,然后再运行文件Servelet。现在发生的事情与我想要的正好相反。我也尝试过使用0作为文件Servelet,但没有帮助。下面提到的是我的过滤器类代码。 下面是我的Servlet部分代码: 下面是我在应用程序日志中获

  • 问题内容: 我正在尝试对我的ElasticSearch Server进行此查询。 基本上,我希望检索名称中与“ network”匹配的所有产品,但仅过滤与或匹配的产品。当我执行此查询时,我收到此错误信息。 我想这里的关键是,但无法理解这里出了什么问题。 问题答案: 是查询,而不是过滤器。 在这种情况下,您可能需要-filter。

  • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。

  • Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。 Servlet 过滤器是可用于 Servlet

  • 问题内容: 我已经编写了REST Web服务方法,并且。以下是Web服务类`@Path(“ / service”)公共类Service { }` 在Web服务方法中,正在使用调用,而正在使用的URL是http:// localhost:8080 / xxxx / xxxx / service / val / zzzz 。zzzz是要传递的值。URL模式的和是/安全。现在,问题没有被调用,而直接调用