从 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 特定知识自动添加用于推送的资源。
我尝试实现一个自定义的 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 特定知识自动添加用于推送的资源。