You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌入式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:42:26