【问题标题】:Jetty HTTP2 server push supportJetty HTTP2 服务器推送支持
【发布时间】:2015-06-03 05:25:48
【问题描述】:

对于SPDY,我们需要实现一个PushStrategy并注册它来推送资源。

HTTP2 支持怎么样?

我喜欢 nginx 的想法,它包括读取 HTTP 响应中的链接头:https://nghttp2.org/blog/2015/02/10/nghttp2-dot-org-enabled-http2-server-push/

谢谢!

【问题讨论】:

    标签: jetty server-push http2


    【解决方案1】:

    Jetty HTTP/2 完全支持 HTTP/2 Push,实际上有不同的风格。 Webtide's website 已经启用了 Jetty 的 HTTP/2 Push。

    有一个PushCacheFilter,它基于Referer 标头实现了在Jetty SPDY 的PushStrategy 中实现的相同算法。

    有一个PushSessionCacheFilter,它使用构建器来实现更复杂的方法来实际推送资源。

    目前两者都使用 Jetty 特定的 API,试图将它们作为 Servlet 4.0 规范的标准,并在实际示例中对其进行测试。

    这种方法的好处是完全自动化,并且不需要应用程序支持:开箱即用,适用于任何旧的/遗留的 web 应用程序。

    Jetty 团队当然可以探索使用 Link 标头的可能性,但这似乎需要应用程序的支持(应用程序必须添加具有正确格式的 Link 标头),以及一个代理层影响表演。 这是由https://bugs.eclipse.org/bugs/show_bug.cgi?id=463457 跟踪的,欢迎任何贡献。

    为了实现自己的资源推送策略,你可以编写一个简单的 Servlet 过滤器,并在其中使用 Jetty 特定的 API(即 Dispatcher.push(...)PushBuilder API)来推送你自己的资源,类似于上面提到的过滤器是做什么的。

    【讨论】:

    • 好的,您能否确认即使这些过滤器真的很有效,在第一次发送请求时也不会推送任何资源?如果应用程序有任何机制有助于在构建时检测引用的资源,那么即使是第一个请求也会利用推送?此外,当我检查 PushBuilder 时,似乎能够避免使用 last-modified/Etag 标头进行推送操作。但是,这些标头是从初始请求中检索的。例如,如果我过滤 HTML 页面,则将推送有关 HTML 页面请求标头的关联 JS 文件。对吗?
    • 当前过滤器确实会在第一个请求时创建缓存,因此它们只会从第二个请求开始推送。目前没有“预填充”缓存的机制,以便它会在第一个请求时推送,但这是一个有趣的特性。请在bugs.eclipse.org/bugs/enter_bug.cgi?product=Jetty 提交功能请求。查看 last modified / etag 标头的目的是避免在浏览器提示其缓存中已有资源时推送。如果主资源自带,JS不应该被推送。我建议我们将其移至 Jetty 邮件列表。
    猜你喜欢
    • 2016-06-14
    • 2017-08-31
    • 2019-08-11
    • 2018-02-25
    • 2011-05-22
    • 2016-10-24
    • 2015-12-04
    • 2017-03-04
    • 2011-06-15
    相关资源
    最近更新 更多