2015-01-12 85 views
0

我嘗試實現自定義PushStrategy,這是一個與Jetty中的SPDY協議的服務器推送支持相關的API。從PushStrategy訪問ServletContext

我實現以下方法:

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> 

而jetty-web.xml中配置了WebAppContext

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

我不知道如何引用y此文件中的現有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

當你通過一個XML文件,如什麼是在Configuring a Specific WebApp Deployment描述的創建一個WebAppContext

您可以爲該特定Web應用程序的<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> 

然後可以使用您所描述引用一個特定的web應用的碼頭XML表示法。現在

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

,回到你的更具體的關注,從PushStrategy執行訪問ServletContext

無法從PushStrategy實現中完成,因爲它在TLS - > SPDY(帶有PushStrategy) - >連接器 - >連接 - > HTTP - >請求 - >處理程序 - > SPDY分層中的層次太高。 WebAppContext - > ServletContext - > Servlet。

雖然您可能會分離行爲。

創建一個你的Servlet上下文有的CustomPushFilter,它有你想要關聯的推送邏輯,通過自定義響應頭來完成。然後您的CustomPushStrategy可以查找這些響應標頭,以瞭解如何關聯這些額外的資源。這種方法的好處是,您的Servlet甚至可以根據servlet的特定知識自動添加資源進行推送。

+0

這不起作用。我的對象是在jetty.xml中創建的,它引用了一個在jetty-web.xml中配置的webapp!請參閱更新的主題 –

+0

spdy.MyPushStrategy實例調用setter,但將空值指定爲參數。 –

+0

最後使用添加所需標題的過濾器。 –

相關問題