2013-02-05 11 views
9

複数のサービス間でのセッション/クッキーを維持します。これは私が私が私の身元を証明するために、すべてのWebサービスへのHTTPヘッダーのカスタムクッキーに渡す必要があり使用しているWebサービスを除いて、うまく動作します。JAX-WSクライアント:私は自動的にWSDLファイルをオフに基づいてWebサービスクライアントを作成するために、Netbeansのを使用してい

私は私の承認を得るためにUtilityという名前のWebサービスを使用します。これは、その後のすべてのWebサービスの呼び出しで提供される必要のあるCookieを設定します。

これは、WebサービスのポートのBindingProviderにjavax.xml.ws.session.maintain~trueを設定することで実現できます。これは、Utility Webサービス内のメソッドへのその後の呼び出しで効果的です。 問題は、これが唯一のその単一のWebサービスのためのセッション/クッキーを維持することです。私は他の人にも同様にそれが必要です。

に別の webservice Historyという名前で渡されたCookieが必要です。どのようにすればいいですか?ユーティリティとヒストリの両方が拡張し、同じセッション状態を共有できるスーパーサービスクラスを持つことは可能ですか?

答えて

14

私は解決策を見つけました。あなたが呼び出しを行った後

あなたはこれを使用してレスポンスヘッダを取得することができます。

((BindingProvider)port).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); 

Set-Cookieヘッダを見つけて、その値を格納します。上記溶液が私のために動作しませんでしたので、

((BindingProvider)port).getRequestContext().put(
      MessageContext.HTTP_REQUEST_HEADERS, 
       Collections.singletonMap("Cookie", Collections.singletonList(cookieValue) 
      ) 
     ); 
+0

おそらく、この方法でCookieを抽出することは、最初の呼び出しの直後にのみ可能です。「Set-Cookie」が設定されているからです。しかし、それでも...ありがとう。これは私に多くの時間を節約しました。 – cljk

3

ちょうどコメント:あなたはCookieヘッダを設定することができます(任意のウェブサービスに)あなたの次の要求の前に続いて

。私はUnsupportedOperationExceptionを取得しました。私は、singletonMapが変更を許可しないために問題が発生したと考えています。 xmlヘッダーも必要でしたので、最初にそれらを設定しました。

Map<String, List<String>> headers= CastUtils.cast((Map)port.getRequestContext().get("javax.xml.ws.http.request.headers")); 
if (headers == null) { 
    headers = new HashMap<String, List<String>>(); 
    port.getRequestContext().put("javax.xml.ws.http.request.headers", headers); 
} 

headers.put("Cookie", Collections.singletonList(cookieValue)); 
((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
+0

はい、SingletonMapsは不変です - 私は単にあなたがMessageContext.HTTP_REQUEST_HEADERS ==「javax.xml.ws.http.request.headers」を知って、それがよりコンパクトに取得するには、コードを確認してください – bradvido

+1

利便性としてそれを使用 –

+0

彼のバージョンは、実際にあります1つの文字は引用符を含めても短いですが、私はあなたが意味することを知っています。定数を使うことは確かに安全です。 :) – Martin

関連する問題