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

Jetty 11迁移至Jetty 12:请求不可变的修改问题求助

Jetty 11 迁移至 Jetty 12:修改不可变请求的实现方案

在Jetty 12中,核心请求对象Request采用不可变设计,无法直接调用setQueryParameters()、setMethod()等修改方法。要实现你的需求,需要通过创建**可变请求副本(MutableRequest)**完成修改,再将修改后的请求传递给后续处理器。

核心思路

Jetty 12提供了MutableRequest类,允许基于原不可变请求创建可修改的副本,完成URL会话标识移除、WOPI请求方法与QueryString映射等操作后,将该副本传入父类的handle方法即可。

适配后的Jetty 12代码示例

class MyJettyHandler extends ResourceHandler {

    @Override
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        StringBuilder fileURL = new StringBuilder(target);
        // 移除URL中的会话标识(保留原有ProcessURLSubst逻辑)
        ProcessURLSubst(fileURL, env);
        
        // 处理WOPI请求,构建新的QueryString参数集合qs
        WOPIRedirectURL(baseRequest, fileURL, qs, session);
        
        // 基于原请求创建可变副本
        MutableRequest mutableRequest = MutableRequest.copy(baseRequest);
        
        // 1. 修改请求方法(例如静态文件处理时强制改为GET)
        String newPath = fileURL.toString();
        mutableRequest.setMethod("GET");
        
        // 2. 设置处理后的新URI
        HttpURI newUri = HttpURI.build(newPath);
        mutableRequest.setHttpURI(newUri);
        
        // 3. 更新QueryParameters
        if (!qs.isEmpty()) {
            mutableRequest.setQueryParameters(qs);
        }
        
        // 4. 设置上下文路径
        mutableRequest.setContext(baseRequest.getContext(), newPath);
        
        // 将修改后的请求传入父类handle方法处理
        super.handle(newPath, mutableRequest, mutableRequest, response);
        
        // 标记原请求已处理,避免后续处理器重复处理
        baseRequest.setHandled(true);
    }
}

关键说明

  • MutableRequest的作用:作为Jetty 12专门提供的可变请求实现,完全兼容原有Request和HttpServletRequest接口,所有修改操作都在副本上进行,不会破坏原请求的不可变性。
  • 会话标识移除:原有ProcessURLSubst逻辑可以直接复用,只需将处理后的URL用于构建新的HttpURI即可。
  • WOPI请求映射:针对GET/POST方法的QueryString映射逻辑保持不变,只需将构建好的参数集合qs设置到mutableRequest中。
  • 请求处理标记:必须调用baseRequest.setHandled(true),告知Jetty原请求已被处理,防止后续其他处理器对原请求进行重复处理。

内容的提问来源于stack exchange,提问作者Michał Niklas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:38:37