OSGi HTTP Whiteboard和ServletContextHelper

时间:2017-07-21 14:09:37

标签: osgi pax-web osgi-http-service

当多个bundle使用相同的ServletContextHelper时,我需要一些关于与Http白板规范相关的ServletContextHelper行为的精确度

规范说:

  

Http Whiteboard实现必须创建一个单独的   每个ServletContextHelper服务的ServletContext实例。   白板服务可以与Servlet Context Helper相关联   使用osgi.http.whiteboard.context.select属性。如果这   未设置property,使用默认的Servlet Context Helper。

如果我理解正确,使用相同ServletContextHelper引用的所有Servlet或Filter都绑定到相同的ServletContext'

然后:

  

可以实现ServletContextHelper的一些实现   例如,使用服务工厂来提供资源   关联的bundle,作为默认实现。因此   白板实现必须使用Servlet Context Helper   注册白板的捆绑包的捆绑上下文   服务。

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

此外,"默认"的行为是什么? ServletContextHelper?总是存在"默认" ServletContextHelper注册了吗?它是在bundle之间共享还是bundle只有一个实例?

1 个答案:

答案 0 :(得分:1)

我在 Pax Web 8 上工作,我真的很想在那里获得正确的行为。

OSGi CMPN 规范的

140.2.7 Relation to the Servlet Container chapter 展示了一张图片,其中实际上有 3 个 layers javax.servlet.ServletContext 对象:

  • 特定于真实 Servlet 容器的 ServletContext 实现。在 Pax Web 中,它是以下之一:
    • org.eclipse.jetty.servlet.ServletContextHandler.Context
    • org.apache.catalina.core.ApplicationContext
    • io.undertow.servlet.spec.ServletContextImpl
  • ServletContext 实现与 org.osgi.service.http.context.ServletContextHelper OSGi 服务的 1:1 关系
  • 为每个 Whiteboard bundle 实现服务工厂合同的 ServletContext,其中除 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()delegates 上面的所有其他方法OsgiServletContext