如何使用独立Jetty进行服务器推送

时间:2016-02-02 19:31:17

标签: http https jetty http2

我正在尝试使用独立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并没有给我那种控制权。

我在互联网上查了几个例子,但大多数都是嵌入式Jetty。 有人请帮我弄清楚如何在我的静态网站上使用独立的Jetty测试服务器推送功能吗?

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

1 个答案:

答案 0 :(得分:3)

问题太多而且你想做什么并不是很清楚:)

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的实现以获得更好的实现。