为什么 Servlet.getContext(String) 在取消部署后不 return null

Why Servlet.getContext(String) does not return null after undeploy

我正在使用 tomcat-10(雅加达)。根据 to the doc getContext(String) return null 如果上下文不存在或访问受限。但在实践中是不正确的。例如,我有两个 /app1/app2 的 Web 应用程序。在 运行 之后我取消部署 /app2。我还检查了使用 JMX 注册的 MBeans,并且没有注册的带有上下文 /app2 的 servlet。但是当我调用 getContext(/app2) 时,它 returns ROOT servlet。是错误还是正常工作?

更新 为了进行测试,我只是删除了 tomcat 默认 ROOT 网络应用程序。当我调用 getContext 方法时删除后,如果请求的上下文不存在,我会得到 null 。所以我认为 Servlet

的文档或自定义实现中缺少一些信息

getContext 方法是为不同的 Web 应用程序获取对 servlet 上下文的引用,如果您当前的应用程序确实有权访问由 tomcat 默认值指定的其他上下文,即跨上下文,则该方法不会为 null = 真。

此外,您当前的网络应用程序已经引用了 servlet 上下文,可能在您的应用程序变量中

ServletContext#getContext 的参数不需要指向上下文的确切 URI。因此:

  • 所有 /app1 开始 的字符串将为您提供 /app1 应用程序的上下文,
  • 所有 /app2 开始 的字符串将为您提供 /app2 应用程序的上下文,
  • 在您停止 /app2 后,对 /app2 的所有请求都将被路由到 ROOT 上下文。因此 getContext("/app2") 将 return ROOT 上下文。