3

Jetty でホストされる Web アプリケーションでは、サーブレット フィルターを使用して URL から情報を取得し、場合によっては非 Restlet サーブレットにリクエストをルーティングします。Restlet サーブレットの場合、ServerResource サブクラスに情報を渡すことができるようにしたいと考えています。これは、HttpServletRequest の属性に情報を格納することで実現できるはずです。(Restlet はこれを達成するための別のメカニズムをサポートしていますか?「Restlet in Action」またはここのスタックオーバーフローでは何も見つかりませんでした。)

ServletAdapterは、サーブレット要求属性を Restlet HttpRequest の属性にコピーしますが、そのコンストラクターは、スーパークラス (およびデフォルト アダプター) ServerAdaptor (サーブレット要求属性をコピーしない) のような Context パラメーターではなく、ServletContext パラメーターを取ります。問題を解決するための ServletAdapter。

HttpServerHelperのjavadocServerServlet.createServer() によってインスタンス化された は、「adapter」という名前のコンテキスト パラメータを ServerAdapter サブクラスのクラス名に設定すると、HttpServerHelper が指定されたクラスを使用するようになると主張していますが、私のデバッグでは、「adapter」コンテキストがパラメータは、親コンテキストにはありますが、ServerServlet.createServer() の擬似サーバーを介して HttpServerHelper コンストラクタに渡される子コンテキストには存在しません。これは私にはバグのように見えます:AFAICT、子コンテキストは親の属性またはパラメーターを持たないため、現在実装されている HttpServerHelper は、デフォルト以外のアダプターを使用するように指示するパラメーターを認識しません。多分 HttpServerHelper.getHelpedParameters() は、「助けられた」サーバーのコンテキストから「アダプター」パラメーターを追加する必要があります。子コンテキストに存在しない場合、親コンテキスト? (この修正は、HttpServerHelper javadoc: "useForwardedForHeader" に記載されている他のパラメーターにも適用されます。)

回避策として、ServerServlet.createServer() を拡張して、HttpServerHelper に渡す子コンテキストに「adapter」パラメーターをコピーしました。これは機能します。

また、ServerAdapter をサブクラス化して、サーブレット リクエストの属性を均一なリクエストにコピーしました。ServletAdaptor.toRequest() から直接コピーして貼り付けます。これも機能します。

4

2 に答える 2

1

おそらく回避策は、サーブレット環境とサーブレット環境の両方にグローバルコンテキストを提供する別のサーブレットフィルタを実装することです。このコンテキストは、ThreadLocal内に格納できます。レストレットリソースでは、このコンテキストとパラメータにアクセスできます...

お役に立てば幸いです。

ティエリー

于 2013-03-14T14:22:48.030 に答える