我只是构建了一个小型PoC,其中我使用带有http / 2的Jetty 9.3.9.M1嵌入式服务器和带有Apache Wicket的PushBuilder API将资源推送到客户端。
我使用以下服务器设置:
Server server = new Server();
// HTTP Configuration
HttpConfiguration http_config = new HttpConfiguration();
http_config.setSecureScheme("https");
http_config.setSecurePort(8443);
http_config.setSendXPoweredBy(true);
http_config.setSendServerVersion(true);
// keytool -keystore keystore -alias jetty -genkey -keyalg RSA
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath(new File(".","keystore").getCanonicalPath());
sslContextFactory.setKeyStorePassword("123456789");
sslContextFactory.setKeyManagerPassword("123456789");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
sslContextFactory.setUseCipherSuitesOrder(true);
// HTTPS Configuration
HttpConfiguration https_config = new HttpConfiguration(http_config);
https_config.addCustomizer(new SecureRequestCustomizer());
// HTTP Connector
ServerConnector http1 = new ServerConnector(server, new HttpConnectionFactory(http_config),
new HTTP2CServerConnectionFactory(http_config));
http1.setPort(8080);
server.addConnector(http1);
// HTTP/2 Connection Factory
HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(https_config);
NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol(http1.getDefaultProtocol());
// SSL Connection Factory
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol());
// HTTP/2 Connector
ServerConnector http2Connector = new ServerConnector(server, ssl, alpn, http2,
new HttpConnectionFactory(https_config));
http2Connector.setPort(8443);
server.addConnector(http2Connector);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setServer(server);
webAppContext.setContextPath("/");
webAppContext.setWar("src/main/webapp");
server.setHandler(webAppContext);
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.addHandler(webAppContext);
server.setHandler(contexts);
ALPN.debug = false;
server.start();
server.join();
现在我面临的问题是,当我对这样的资源发出http / 1.1请求时:
状态代码304在第二个请求之后显示在chrome调试器中
如果我对同一资源发出http / 2.0请求:
状态代码200显示在每个请求上 - 似乎客户端没有缓存它。
以下是git项目的链接:https://github.com/klopfdreh/jetty-http2-example
亲切的问候,并提前感谢。
答案 0 :(得分:1)
这个问题已在github上作为一个问题进行了讨论和解决。
看看这里:
https://github.com/eclipse/jetty.project/issues/801
获得相关的答复。
要点:
问题是对PushBuilder API的误解。如果对索引页面发出请求,则将使用关于该页面的缓存信息来确定是否将推送更多资源。大多数情况下,标题项“If-Modified-Since”用于检测是否需要进一步的推送操作。
因此,应用程序必须提供有关缓存的逻辑。
最简单的实现是查看索引页面请求的“If-Modified-Since”标头是否在索引页文件本身的最后修改日期之前。例如。