【问题标题】:Access to ServletContext from PushStrategy从 PushStrategy 访问 ServletContext
【发布时间】:2015-03-10 05:14:30
【问题描述】:

我尝试实现一个自定义的 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>

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>

【问题讨论】:

    标签: jetty spdy


    【解决方案1】:

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

    您可以为特定 web 应用的 &lt;Configure&gt; 元素配置 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 表示法来引用该特定 web 应用程序。

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

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

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

    不过,您也许可以拆分行为。

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

    【讨论】:

    • 这不起作用。我的对象是在 jetty.xml 中创建的,它引用了在 jetty-web.xml 中配置的 webapp!查看更新的主题
    • spdy.MyPushStrategy 实例调用了它的设置器,但一个空值被指定为参数。
    • 这是一个我们可以在某处看到的开源 PushStrategy 吗?
    • 开箱即用的实现通常基于跨服务器(jetty、undertow 等)的相同技术:收集资源以使用浏览器发送的 HTTP 请求的“referer”标头进行推送以加载静态数据
    猜你喜欢
    • 2018-12-22
    • 2012-04-04
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多