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

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已标记为过时,推荐两种迁移路径:

  1. 若需保留Jetty Handler模式:使用Handler.Wrapper(减少冗余代码)或直接实现Handler接口,替代过时的AbstractHandler。
  2. 若逻辑为通用请求/响应处理:优先采用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:25