如何在嵌入式Jetty 10中启用HTTP/2?及问题排查
Jetty 10.0.11启用HTTP/2失败问题排查与解决
疑问解答与问题分析
1. HTTP/2是否支持localhost?
支持。但Chrome对localhost的HTTPS证书有严格要求:
- 证书必须被浏览器信任(需添加到系统或浏览器的信任根证书库)
- 证书的
Subject Alternative Name必须包含localhost或对应IP
如果证书不满足要求,Chrome会自动降级到HTTP/1.1,甚至提示不安全连接。
2. 是否需要添加更多依赖库?
当前依赖已覆盖HTTP/2核心组件,但需注意:
- 所有Jetty相关依赖的版本必须与
jetty-server(10.0.11)完全一致,避免版本冲突 jetty-alpn-java-server依赖JDK内置的ALPN实现,需确保使用JDK 11及以上版本(Jetty 10最低要求JDK 11)
无需额外添加其他依赖,若存在版本不一致的情况,需统一调整版本号。
3. 代码中的问题
(1) ALPN协议列表未明确指定
当前代码仅设置了默认协议,但未声明支持h2协议,导致ALPN协商阶段无法匹配HTTP/2,需添加:
alpn.setProtocols("h2", "http/1.1");
明确告诉ALPN优先协商h2,降级时使用HTTP/1.1。
(2) HttpConfiguration修改时机错误
代码中先创建HttpConnectionFactory http1,再给httpConfig添加SecureRequestCustomizer,会导致http1使用未添加自定义器的配置,而http2使用添加后的配置。正确做法是先完成HttpConfiguration的所有配置,再创建连接工厂:
HttpConfiguration httpConfig = new HttpConfiguration(); httpConfig.setSendServerVersion(false); httpConfig.setSendXPoweredBy(false); // 先添加自定义器 httpConfig.addCustomizer(new SecureRequestCustomizer(false)); // 再创建连接工厂 HttpConnectionFactory http1 = new HttpConnectionFactory(httpConfig); HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(httpConfig);
(3) SslContextFactory配置验证
需确保证书加载逻辑正确,示例参考:
sslContextFactory.setKeyStorePath("/path/to/keystore.jks"); sslContextFactory.setKeyStorePassword("password"); sslContextFactory.setKeyManagerPassword("password");
若证书未正确加载,SSL握手失败会导致连接降级或失败。
(4) ServerConnector构造参数顺序
当前参数顺序ssl, alpn, http2, http1是正确的(SSL层 -> ALPN层 -> 应用层协议),无需调整。
4. 是否需要修改Servlet相关配置?
无需特殊修改。Jetty 10支持Servlet 4.0/5.0,HTTP/2与Servlet规范完全兼容。若项目中存在老旧的Filter或Servlet依赖HTTP/1.1特定特性(如直接操作HTTP/1.1的Header格式),需确保这些组件兼容HTTP/2,否则可能导致异常,但一般不会影响协议协商。
内容的提问来源于stack exchange,提问作者Horcrux7
相关产品推荐
相关产品推荐

