如何使用独立 Jetty 进行服务器推送
How to do server push with standalone Jetty
我正在尝试使用独立 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 客户端的示例用例的方向,我将非常感激。
问题太多,不太清楚你想做什么:)
Jetty 在服务器上公开了一个 Jetty-specific 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 APIs来执行请求和接收推送,你必须使用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 版本、条件 headers 等。请查看 PushCacheFilter
here 的实现以获得更好的实现。
我正在尝试使用独立 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 客户端的示例用例的方向,我将非常感激。
问题太多,不太清楚你想做什么:)
Jetty 在服务器上公开了一个 Jetty-specific 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 APIs来执行请求和接收推送,你必须使用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 版本、条件 headers 等。请查看 PushCacheFilter
here 的实现以获得更好的实现。