Embedded Jetty从6.1.7升级到9.4.43后FileProxyServlet访问404求助
Jetty 6.1.7 升级至 9.4.43 后自定义 Servlet 404 问题排查方案
核心变更说明
Jetty 6 到 Jetty 9 对 Servlet 注册逻辑、路径匹配规则、jetty.xml 配置语法做了多处不兼容调整,是导致原有 FileProxyServlet 映射失效的核心原因。
分步排查点
- 修正 Servlet 路径映射规则
Jetty 9 对 Servlet 路径映射做了严格的规范校验,Jetty 6 中配置的/cts/output映射仅能命中完全一致的请求路径,若业务请求路径为/cts/output/xxx类带后缀的形式,会无法匹配。需要将 jetty.xml 中 Servlet 的 url-pattern 调整为/cts/output/*。 - 验证 Servlet 初始化状态
Jetty 9 不会默认抛出 Servlet 初始化失败的致命错误,仅会跳过注册,访问时返回 404。可以在服务启动参数中加入-Dorg.eclipse.jetty.servlet.LEVEL=DEBUG开启 Servlet 初始化日志,确认 FileProxyServlet 有没有被成功注册到 ServletContext 中,排查是否存在类路径错误、init-param 缺失的问题。 - 校验 ContextPath 配置
若你在新版 jetty.xml 中新增了 ContextHandler 的 contextPath 配置,会导致根路径映射变更,只有当 contextPath 配置为/时,才能直接通过/cts/output访问自定义 Servlet,否则需要在访问路径前加上配置的 contextPath 前缀。 - 调整 Servlet 加载优先级
Jetty 9 默认的 DefaultServlet 用于处理静态文件,优先级高于自定义 Servlet,若 DefaultServlet 配置了/*的映射规则,会优先拦截所有请求,导致自定义 Servlet 无法被命中。需要将 FileProxyServlet 的loadOnStartup属性设为 1,高于 DefaultServlet 的默认优先级 0。 - 修正配置加载代码逻辑
Jetty 9 废弃了 6 版本中XmlConfiguration类的部分重载方法,原有加载配置的代码需要调整为直接传入 Server 实例调用configure方法,且需要在启动 Server 前手动触发 ServletContextHandler 的 start 逻辑,确保 Servlet 完成初始化。
内容的提问来源于stack exchange,提问作者Avinash Modi
相关产品推荐
相关产品推荐

