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

Jetty 12升级后如何获取HttpServletRequest/Response适配Jakarta Filter

解决Jetty 12.x中获取Jakarta HttpServletRequest/Response调用Filter的问题

核心思路

Jetty 12.x采用统一的请求响应模型,通过as(Class)方法可将Jetty原生的Request/Response转换为Jakarta EE技术栈的适配对象,以此对接Jakarta规范的Filter。

步骤与代码示例

  1. 对齐依赖与API版本
    替换旧的javax.servlet相关依赖为Jakarta版本,同时引入Jetty 12的Jakarta Servlet模块(以Maven为例):

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jakarta-servlet</artifactId>
        <version>12.0.x</version>
    </dependency>
    <!-- 自定义Filter依赖的Jakarta Servlet API -->
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>
    
  2. 转换请求响应并调用Filter
    在Jetty 12的handle方法中,通过as()方法获取Jakarta规范的实例,再调用Filter的doFilter方法:

    import org.eclipse.jetty.server.Request;
    import org.eclipse.jetty.server.Response;
    import org.eclipse.jetty.server.handler.AbstractHandler;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import jakarta.servlet.Filter;
    import jakarta.servlet.FilterChain;
    
    public class CustomHandler extends AbstractHandler {
        private final Filter customJakartaFilter;
        private final FilterChain customFilterChain;
    
        public CustomHandler(Filter customJakartaFilter, FilterChain customFilterChain) {
            this.customJakartaFilter = customJakartaFilter;
            this.customFilterChain = customFilterChain;
        }
    
        @Override
        public void handle(Request request, Response response, Callback callback) throws Exception {
            // 转换为Jakarta规范的请求响应对象
            HttpServletRequest jakartaRequest = request.as(HttpServletRequest.class);
            HttpServletResponse jakartaResponse = response.as(HttpServletResponse.class);
    
            // 调用Jakarta Filter的doFilter方法
            customJakartaFilter.doFilter(jakartaRequest, jakartaResponse, customFilterChain);
    
            // 通知Jetty请求处理完成,避免请求挂起
            callback.succeeded();
        }
    }
    
  3. 关键注意事项

    • 自定义Filter必须实现jakarta.servlet.Filter接口,不能再使用旧的javax.servlet.Filter。
    • 自定义FilterChain需基于jakarta.servlet.FilterChain实现。
    • 若转换对象失败,检查Server配置是否使用了Jakarta版本的ServletContextHandler(引入jetty-jakarta-servlet模块后默认适配Jakarta)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:56