我正在尝试使用独立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客户端的示例用例,我将非常感激。
答案 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的实现以获得更好的实现。