Jetty 11迁移至Jetty 12:AbstractHandler移植及对象访问问题
Jetty 11 到 Jetty 12 Handler 迁移指南
问题1:访问原baseRequest和request对象
Jetty 12的新版Request(org.eclipse.jetty.server.Request)已整合旧版baseRequest与HttpServletRequest的全部功能:
- 旧版
baseRequest、request的所有方法可直接通过新版Request实例调用,比如获取请求头、请求参数等。 - 若需转换为Servlet标准API的
HttpServletRequest,调用request.getHttpServletRequest()即可;同理,response.getHttpServletResponse()可获取HttpServletResponse。
问题2:正确移植AbstractHandler子类的方式
Jetty 12中AbstractHandler已标记为过时,推荐两种迁移路径:
- 若需保留Jetty Handler模式:使用
Handler.Wrapper(减少冗余代码)或直接实现Handler接口,替代过时的AbstractHandler。 - 若逻辑为通用请求/响应处理:优先采用Servlet标准规范的
Filter或HttpServlet,提升代码兼容性与可移植性。
Jetty 11 原实现示例
import org.eclipse.jetty.server.AbstractHandler; import org.eclipse.jetty.server.Request; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HeaderHandler extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { // 检查请求头 String authHeader = request.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); baseRequest.setHandled(true); return; } // 设置响应头 response.setHeader("X-Custom-Header", "Jetty11-Migrated"); baseRequest.setHandled(false); // 交给后续Handler处理 } }
Jetty 12 迁移实现示例
方式1:基于Handler.Wrapper实现(简洁兼容Handler模式)
import org.eclipse.jetty.server.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HeaderHandlerWrapper extends Handler.Wrapper { @Override public boolean handle(Request request, Response response, Callback callback) throws Exception { HttpServletRequest servletRequest = request.getHttpServletRequest(); HttpServletResponse servletResponse = response.getHttpServletResponse(); // 检查请求头逻辑 String authHeader = servletRequest.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); callback.succeeded(); // 通知Jetty请求处理完成 return true; // 返回true表示请求已处理,不再传递给后续Handler } // 设置响应头 servletResponse.setHeader("X-Custom-Header", "Jetty12-Wrapper"); // 调用后续Handler处理请求 return super.handle(request, response, callback); } }
方式2:Servlet标准Filter实现(推荐)
如果你的逻辑是通用请求头校验、响应头设置,Filter是更符合规范的选择:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(urlPatterns = "/*") public class HeaderFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 检查请求头 String authHeader = httpRequest.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } // 设置响应头 httpResponse.setHeader("X-Custom-Header", "Jetty12-Filter"); // 传递给后续Filter或Servlet处理 chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} }
关键迁移点总结
- 不再需要调用
baseRequest.setHandled(),通过返回true(请求已处理)或false(继续传递)控制流转,且必须调用callback.succeeded()/callback.failed()通知Jetty请求状态。 - 新版
Request/Response已整合旧版双对象功能,无需区分baseRequest与request。 - 优先采用Servlet标准组件(Filter/HttpServlet),减少对Jetty私有API的依赖。
内容的提问来源于stack exchange,提问作者Voila
相关产品推荐
相关产品推荐

