【问题标题】:How to do server push with standalone Jetty如何使用独立的 Jetty 进行服务器推送
【发布时间】:2016-05-11 18:38:13
【问题描述】:

我正在尝试使用独立 Jetty 在静态网站上测试服务器推送功能。

我的网站由一个 index.html Â+ 1 CSS + 一堆图片组成。目录结构为:

/Album
   Â|
   Â|-----index.html
   Â|-----style.css
   Â|------/images
        Â|
        Â|-----image 1.png
        Â|---a set of 100 images
        Â|---image100.png

因为我只是想快速测试服务器推送功能,所以我没有将此网站编码为 Java Web 项目,因此没有任何 web.xml 文件。

但是,Jetty 文档要求将 PushCacheFilter 添加到 web.xml。因此,我在我的项目中创建了一个 /Album/WEB-INF/web.xml 并将 PushCacheFilter 添加为指定的文档。

首先,我无法从文档中了解 PushCacheFilter 的工作原理。 其次,我想控制哪些文件被推送,哪些不被推送。从文档来看,PushCacheFilter 似乎没有给我那种控制权。

我在 Internet 上查看了一些示例,但其中大多数都带有嵌入式 Jetty。 有人可以帮我弄清楚如何使用独立的 Jetty 在我的静态网站中测试服务器推送功能吗?

另外,我想问一下 Jetty 的 GitHub 存储库中的 HTTP/2 客户端示例是否可以直接使用?抱歉,还没有亲自测试客户端。我只是在存储库中看到它并且很好奇。如果有人能指出使用 Jetty 的 HTTP 和 HTTP/2 客户端的示例用例的方向,我将非常感激。

【问题讨论】:

    标签: http https jetty http2


    【解决方案1】:

    问题太多,不清楚你想做什么:)

    Jetty 在服务器上公开一个特定于 Jetty 的 API 以执行推送(最终,这些 API 将成为 Servlet 4.0 的一部分)。

    您可以使用 org.eclipse.jetty.server.Request.getPushBuilder() 访问此 API,请参阅 http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/server/PushBuilder.html

    然后,PushBuilder API 将允许您设置要推送的资源,然后再推送它。

    PushCacheFilter 实现了相关资源的缓存。 当请求具有相关辅助资源的主资源时,PushCacheFilter 使用 PushBuilder API 推送这些相关资源。

    如果PushCacheFilter 不符合您的需求,您可以使用自己的逻辑编写自己的过滤器并使用PushBuilder API 执行推送。

    在客户端,如果你想使用 Java API 来执行请求和接收推送,你必须使用HTTP2Client,参见http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/http2/client/HTTP2Client.html

    您可以找到有关如何执行请求和接收推送here 的示例。

    如果您想要一个与您的类似的完整示例(index.html + 一堆图像),您可以查看HTTP/2 demo

    更新:如何使用PushBuilder 的简单示例。

    public class MyPushFilter implements Filter {
    @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpRequest = (HttpServletRequest)request;
            String uri = httpRequest.getRequestURI();
            switch (uri) {
                case "/index.html":
                    // Jetty specific APIs for now.
                    PushBuilder pushBuilder = Request.getBaseRequest(request).getPushBuilder();
                    pushBuilder.path("/styles.css").push();
                    pushBuilder.path("/background.png").push();
                    break;
                default:
                    break;
            }
            chain.doFilter(req, resp);
        }
    }
    

    上面的例子非常非常简单。它不处理 HTTP 版本、条件标头等。请查看 PushCacheFilter here 的实现以获得更好的实现。

    【讨论】:

    • 感谢您的回复。我同意有太多的问题。那时我刚开始使用 Jetty。我也在邮件列表中讨论过这个问题。我现在正在寻找的是一个关于如何将 PushBuilder 用于具有独立 Jetty 的静态网站的小示例。请你给我一些关于它的快速指示。
    • Jetty 通过其DefaultServlet 提供静态文件,因此为了执行推送,您只需添加PushCacheFilter。看看我指给你的演示。我还编辑了PushBuilder 的快速示例的答案。请注意,API 可能会发生变化以反映 Servlet 4 的发展。
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2015-10-16
    • 2015-06-03
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多