从 PushStrategy 访问 ServletContext

Access to ServletContext from PushStrategy

我尝试实现一个自定义的 PushStrategy,它是一个 API 与 Jetty 中 SPDY 协议的服务器推送支持相关的。

我实现了以下方法:

public Set<String> apply(Stream stream, Fields requestHeaders, Fields responseHeaders);

但是我需要在方法调用中访问 ServletContext,但我不知道如何访问它。

我正在研究一种在 jetty.xml 中注入 WebAppContext 的方法:

<New id="pushStrategy" class="spdy.MyPushStrategy">
    <Set name="webAppContext">
        <Ref id="..." />
    </Set>
</New>

问题是这个配置步骤在 jetty.xml:

中声明的服务器块中
<Configure id="Server" class="org.eclipse.jetty.server.Server">....</Configure>

而WebAppContext是在jetty中配置的-web.xml

<Configure id="WebAppContext" class="org.eclipse.jetty.webapp.WebAppContext">

我不知道如何在此文件中引用任何现有的 WebAppContext ID。

这是我的 Maven 插件配置:

            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>${jetty-version}</version>
            <configuration>
                <stopPort>8888</stopPort>
                <stopKey>quit</stopKey>
                <jvmArgs>
                    -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/npn/npn-boot/${npn-version}/npn-boot-${npn-version}.jar
                </jvmArgs>
                <webAppConfig>
                    <jettyEnvXml>${basedir}/src/main/config/jetty-web.xml</jettyEnvXml>
                </webAppConfig>
                <jettyXml>${basedir}/src/main/config/jetty.xml</jettyXml>
                <contextPath>/</contextPath>
            </configuration>

当您通过 XML 文件创建 WebAppContext 时,如 Configuring a Specific WebApp Deployment.

中所述

您可以为该特定网络应用程序的 <Configure> 元素配置 id 属性。

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
      "http://www.eclipse.org/jetty/configure_9_0.dtd">

<Configure id="myapp1" class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/wiki</Set>
  <Set name="war">/opt/myapp/myapp.war</Set>
</Configure>

然后您可以使用您描述的 Jetty XML 符号来引用该特定的网络应用程序。

<New id="pushStrategy" class="spdy.MyPushStrategy">
  <Set name="webAppContext">
    <Ref id="myapp1" />
  </Set>
</New>

现在,回到您更具体的问题,从 PushStrategy 实现访问 ServletContext

这不能通过 PushStrategy 实现来完成,因为它在 TLS -> SPDY(使用 PushStrategy)-> 连接器 -> 连接 -> HTTP - 的分层中也是如此 high-level > 请求 -> 处理程序 -> WebAppContext -> ServletContext -> Servlet。

尽管如此,您也许可以拆分行为。

创建一个您的 Servlet 上下文所具有的 CustomPushFilter,它具有您要为推送关联的内容的逻辑,通过自定义响应 header 完成。然后您的 CustomPushStrategy 可以查找那些响应 header 以了解如何关联这些额外资源。这种方法的好处是您的 Servlet 甚至可以根据 servlet 特定知识自动添加用于推送的资源。