2012-04-18 9 views
3

私はスタンドアロンのWebサービスクライアントを持っています。いずれかのWebメソッドを呼び出すときには、追加の "cookie"文字列がで暗黙的に(Webメソッドパラメータではない)がWSに渡されなければなりません。もう一方の側のWSは文字列を取得して使用できる必要があります。これはどのように達成できますか?各WebサービスコールでCookieを自動的に渡します。

私は次のようにサービスを呼び出す:私は必要なもの

Service srv = Service.create(new URL(WSDL), QNAME); 
myClassPort = srv.getPort(MyClass.class); 

は、クライアントがこの「クッキー」の文字列に私はいくつかのリモートを起動するたびに送信するだろう最初の行、前にいくつかのコードを配置することですメソッドを使用してmyClassPort。どうも。

答えて

6

デフォルトでは、JAX-WS Webサービスとクライアントはステートレスです。クライアントが要求を行うと、セッションに参加している場合、サーバは応答し、接続上にCookieを設定します。しかし、JAX-WSクライアントはそのCookieを無視し、サーバーは後続の要求を新しい対話として扱います。セッションが有効になると、JAX-WSクライアントは、以降の各要求で同じCookieを送信し、サーバーがクライアントセッションを追跡できるようにします。

ウェブサービスでCookieまたはHTTPセッションを使用しないでください。応答の一部としてトークンIDを返します。クライアントはそれを次の要求と共に送ることができます。とにかく

JAX-WS Webサービスクライアントは、javax.xml.ws.session.maintainプロパティを使用して、(クッキーなど)のセッション情報を保持するように構成する必要があります。 他のWebサービススタックにも同様のメカニズムがあります。

は、サーバー側で

JAX-WSは、Webサービスのコンテキストを注入するために、Javaプラットフォーム(JSR 250)のため共通アノテーションによって定義されたいくつかの便利な注釈を使用し、ライフサイクルメソッドを宣言します。 WebServiceContextは、サービスされている要求に関連するコンテキスト情報を保持します。

javax.xml.rpc.server.ServiceLifecycleを実装する必要はありません。 JAX-WSウェブサービスで行う必要があるのは、フィールドまたはメソッドに@Resourceというマークを付けることだけです。 type要素は、java.lang.Objectまたはjavax.xml.ws.WebServiceContextのいずれかである必要があります。

@WebService 
public class HelloWorld { 
    @Resource 
    private WebServiceContext wsContext; 
    public void sayHello(){ 
     MessageContext mc = wsContext.getMessageContext(); 
     HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession(); 

    } 
} 
+0

"ウェブサービスでクッキーまたはHTTPセッションを使用しないでください。応答の一部としてトークンIDを返します。クライアントは次のリクエストとともにそのトークンを送信できます。あなたの答えは Thx!なぜあなたはそれを述べたのか説明できますか?クライアントが各Webメソッドの明示的なパラメータとしてではなく**暗黙的に** IDを送るようにするのはまさにポイントでした。 – azerIO

+2

私の提案では、クライアントは明示的にトークンIDを送信する必要があります。クッキーは、すべてのクライアントを制御できる場合はオプションになる可能性があります。そうでない場合は通常、クッキーはWebサービスには使用されません。 – andih

+1

私はすべてのクライアントを制御できるユースケースについてさらに情報を追加できますか? ** 'java.net.CookieHandler' **を使用することができますか、または' javax.xml.ws.session.maintain'を最良の方法に設定していますか? – mike

関連する問題