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

