1

当多个包使用相同的 ServletContextHelper 时,我需要一些与 Http Whiteboard Specification 相关的 ServletContextHelper 行为的精确度

规范说:

Http Whiteboard 实现必须为每个 ServletContextHelper 服务创建一个单独的 ServletContext 实例。白板服务可以通过使用 osgi.http.whiteboard.context.select 属性与 Servlet 上下文助手相关联。如果未设置此属性,则使用默认的 Servlet 上下文助手。

如果我理解正确,所有使用相同 ServletContextHelper 引用的 Servlet 或过滤器都绑定到相同的“ServletContext”

然后 :

ServletContextHelper 的一些实现可以使用服务工厂来实现,例如从关联的包中提供资源,就像默认实现一样。因此,白板实现必须使用注册白板服务的包的包上下文来获取 Servlet 上下文帮助器。

所以如果一个bundle A用ServletContextHelper X注册了一个Servlet,而bundle B用同一个ServletContextHelper的引用注册了一个Filter,那么Servlet和Filter注册到同一个ServletContext,但是它们的init方法是用两个不同的实例来调用的ServletContext(为了以不同的方式实现 getClassLoader() 方法)?

此外,“默认” ServletContextHelper 的行为是什么?是否总是有一个“默认”的 ServletContextHelper 注册?它是在捆绑包之间共享还是捆绑包只有一个实例?

4

1 回答 1

1

我在 Pax Web 8 上工作,我真的想要让行为正确。

140.2.7与 OSGi CMPN 规范的 Servlet Container 章节的关系显示了一张图片,其中实际上有三层对象javax.servlet.ServletContext

  • ServletContext特定于真实 Servlet 容器的实现。在 Pax Web 中,它是以下之一:
    • org.eclipse.jetty.servlet.ServletContextHandler.Context
    • org.apache.catalina.core.ApplicationContext
    • io.undertow.servlet.spec.ServletContextImpl
  • 与OSGi 服务ServletContext1:1的实现org.osgi.service.http.context.ServletContextHelper
  • ServletContext每个 Whiteboard 捆绑包实现服务工厂合同,其中除了方法之外的所有getClassLoader()方法都委托给上述 SCH 并getClassLoader()返回bundle.adapt(BundleWiring.class).getClassLoader()

这个问题与假设的双重责任原则有关org.osgi.service.http.context.ServletContextHelper。它用于实现功能方面(handleSecurity())和资源分离方面(getResource())。

所以你是对的 - 如果 Bundle A 注册了一个 servlet,而 Bundle B 注册了一个过滤器,两者都将使用相同的 ServletContext 实例(由引用的 ServletContextHelper 支持),但它们的init()方法将提供不同的、特定于包的ServletContext.

这就是简单的委托实现,有两种实现方式:

  • org.ops4j.pax.web.service.spi.servlet.OsgiServletContext实现 1:1 行为
  • org.ops4j.pax.web.service.spi.servlet.OsgiScopedServletContext实现getClassLoader()并将所有其他方法委托给上述方法OsgiServletContext
于 2021-02-19T12:10:23.983 回答