从PushStrategy访问ServletContext

时间:2015-01-12 12:24:24

标签: jetty spdy

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

我实现了以下方法:

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中声明的Server块中:

<Configure id="Server" class="org.eclipse.jetty.server.Server">....</Configure>

在jetty-web.xml中配置WebAppContext

<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>

1 个答案:

答案 0 :(得分:1)

通过XML文件创建WebAppContext时,例如Configuring a Specific WebApp Deployment中描述的内容。

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

示例:

<?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表示法来引用该特定的Web应用程序。

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

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

这不能通过PushStrategy实现来完成,因为它在TLS的分层中太高级了 - &gt; SPDY(使用PushStrategy) - &gt;连接器 - &gt;连接 - &gt; HTTP - &gt;请求 - &gt;处理程序 - &gt; WebAppContext - &gt; ServletContext - &gt;的servlet。

你可以分开行为。

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