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
相关产品推荐
相关产品推荐

