【问题标题】:How Tomcat 8 Handles websocket upgrade requestTomcat 8 如何处理 websocket 升级请求
【发布时间】:2014-11-24 02:01:37
【问题描述】:

我想了解在 tomcat 中处理 websocket 升级请求?它是通过过滤器还是 servlet 完成的? TOmcat-8如何处理ws升级请求。

谢谢,
阿努杰

【问题讨论】:

    标签: tomcat websocket tomcat8


    【解决方案1】:

    Tomcat 使用过滤器来查找启动 WebSocket 连接的 HTTP 升级请求,并在看到时将其传递给适当的处理程序。

    过滤器是使用 ServletContainerInitializer 配置的。过滤器的位置将取决于 Web 应用程序配置的其他过滤器以及 Web 应用程序将它们放置在 FilterChain 中的位置。例如,Web 应用程序可能希望在 Web Socket 过滤器之前放置一个安全过滤器,而 Tomcat 允许这样做。

    【讨论】:

    • 小心,这是javax.websocket 规范未定义的行为。这是针对该特定规范的开放错误 - 请参阅 WEBSOCKET_SPEC-188
    • @MarkThomas:如何检查请求以确定它是 websocket 请求还是 HTTP 请求?
    • Tomcat 查找 WebSocket 规范中定义的 HTTP 升级标头以及已注册端点的匹配 URI。如果两者都找到,则将请求传递给 WebSocket,否则过滤器将其传递给链中的下一个过滤器。
    【解决方案2】:

    WebSockets 是一个完全不同的协议。它们不是由过滤器或 servlet 处理,而是由 EndPoints 处理。要创建它们,您可以使用扩展端点类,但与 Java EE 中的其他所有内容一样,您现在可以使用注释。欲了解更多信息,请查看最新文档Java API for WebSockets

    要在客户端创建它们,请求以 HTTP 开始,也许是 JavaScript,但在 Tomcat 上,端点正在侦听,而不是您的普通 servlet。

    【讨论】:

    • 没错!!但是Tomcat必须找到处理websocket升级请求的方法。我想知道Tomcat如何处理升级请求?例如,jetty 在前面有一个 ws upgrade 过滤器,它会在请求到达过滤器时立即升级。
    • 我查看了源代码,了解到“org/apache/tomcat/websocket/server/WsFilter.java”处理websocket的升级。请让我知道我的理解是否正确?此外,这个过滤器将是第一个将被调用的过滤器,是否是由 tomcat 指定的过滤器的任何其他排序?
    猜你喜欢
    • 2018-09-22
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多