You need to enable JavaScript to run this app. Jetty 11下HTTP/1.1升级到HTTP/2后如何编写适配的Handler?
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 11下HTTP/1.1升级到HTTP/2后如何编写适配的Handler?

Jetty 11 HTTP/2 Handler适配问题解答

核心结论

你当前编写的DummyHandler本身就可以正常处理HTTP/2请求,不需要额外修改适配,已经可以享受HTTP/2的核心收益。

原理说明

  • Jetty的HTTP/2支持是在连接器底层透明实现的:HTTP/2的stream管理、帧解析、多路复用、头部压缩等逻辑全部由Jetty核心的HTTP2ServerConnectionFactory(加密h2)或HTTP2CServerConnectionFactory(明文h2c)处理,请求到达Handler层前,已经被封装为标准的HttpServletRequest/HttpServletResponse对象,上层业务无需感知底层协议差异。
  • 你感知到的“request/response是HTTP/1.1规范的对象”是Servlet API的统一抽象设计,不管底层是HTTP/1.1、HTTP/2还是HTTP/3,上层都用同一套API,不会暴露底层协议的实现细节。

如需使用HTTP/2专属特性的扩展写法

只有当你需要用到HTTP/2独有的能力(比如服务器推送、获取stream元数据)时,才需要调用Jetty的扩展API,示例如下:

public class DummyHandler extends AbstractHandler {
    @Override
    public void handle(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
        jettyRequest.setHandled(true);
        
        // 可先获取当前请求实际使用的协议
        String protocol = jettyRequest.getProtocol();
        if (protocol.startsWith("HTTP/2")) {
            // 示例:使用HTTP/2服务器推送,提前推送静态资源
            PushBuilder pushBuilder = request.newPushBuilder();
            if (pushBuilder != null) {
                pushBuilder.path("/static/common.css").push();
                pushBuilder.path("/static/main.js").push();
            }
        }

        // 原有响应逻辑无需修改
        response.setStatus(HttpStatus.OK_200);
        response.setContentType("text/html; charset=UTF-8");
        response.getWriter().write(
            "<!DOCTYPE html>" +
            "<html>" +
            "<head>" +
            "  <title>Jetty Hello World Handler</title>" +
            "</head>" +
            "<body>" +
            "  <p>Hello World</p>" +
            "</body>" +
            "</html>"
        );
    }
}

注意事项

请先确认你的Jetty服务端连接器配置正确,才能保证HTTP/2生效,嵌入式Jetty的HTTP/2配置示例如下:

Server server = new Server();
HttpConfiguration httpConfig = new HttpConfiguration();
// 同时支持HTTP/1.1和HTTP/2明文升级
HttpConnectionFactory http11 = new HttpConnectionFactory(httpConfig);
HTTP2CServerConnectionFactory h2c = new HTTP2CServerConnectionFactory(httpConfig);
ServerConnector connector = new ServerConnector(server, http11, h2c);
connector.setPort(8080);
server.addConnector(connector);

server.setHandler(new DummyHandler());
server.start();

内容的提问来源于stack exchange,提问作者ThaiLB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:00:02