从Jetty 11迁移至Jetty 12:HandlerList缺失后的处理器配置咨询
Jetty 11 → 12 处理器配置适配方案
核心替换:用HandlerCollection替代HandlerList
Jetty 12 移除了HandlerList,但它的父类HandlerCollection完全继承了原有功能——按添加顺序依次调用所有处理器,直接替换就能复用原来的多处理器配置逻辑。
资源路径API调整
Jetty 12 删掉了setBaseResourceAsString方法,得改用ResourceFactory来创建资源实例:
// 替换原来的setBaseResourceAsString(resource_base) static_handler.setBaseResource(ResourceFactory.of(server).newResource(resource_base));
ResourceFactory是Jetty 12里统一管理资源的入口,不管是文件系统路径还是classpath资源都能处理。
修改后的完整代码
static private void set_jetty_handlers(Server server) { ... // 替换HandlerList为HandlerCollection HandlerCollection handlers = new HandlerCollection(); // 静态资源处理器配置 ServletContextHandler static_handler = new ServletContextHandler(); static_handler.insertHandler(new GzipHandler()); static_handler.setContextPath("/"); static_handler.setBaseResource(ResourceFactory.of(server).newResource(resource_base)); ... // 自定义处理器配置(继承自ResourceHandler) My_jetty_handler my_handler = new My_jetty_handler(); my_handler.setWelcomeFiles(new String[] { ... }); my_handler.setBaseResource(ResourceFactory.of(server).newResource(resource_base)); my_handler.setCacheControl(MAX_AGE); ... // 给自定义处理器添加Gzip支持 GzipHandler my_handler_gzip = new GzipHandler(); my_handler_gzip.addIncludedMimeTypes(...); my_handler_gzip.setHandler(my_handler); handlers.addHandler(my_handler_gzip); handlers.addHandler(static_handler); // 别名支持配置 ContextHandler context_handler = new ContextHandler(); context_handler.addAliasCheck(new ApproveAllAliases()); context_handler.setHandler(handlers); // IP访问控制 InetAccessHandler access_handler = new InetAccessHandler(); addIPRules(access_handler); access_handler.setHandler(context_handler); server.setHandler(access_handler); }
其他注意事项
- 原有的处理器链式结构(Gzip包装、别名检查、IP访问控制)完全兼容,不用调整层级关系。
- 只要你的
My_jetty_handler已经适配了Jetty 12的ResourceHandlerAPI(比如之前改的请求地址获取逻辑),就能正常运行。如果还有其他重写方法报错,查下Jetty 12的ResourceHandler文档调整就行。 - 别名检查用的
ApproveAllAliases还能用,要是想更严谨,也可以换成AllowSymLinkAliasChecker这类细粒度的实现。
内容的提问来源于stack exchange,提问作者Michał Niklas
相关产品推荐
相关产品推荐

