3

スタンドアロンのWebサービスクライアントがあります。Webメソッドのいずれかを呼び出す場合、追加の「cookie」文字列を暗黙的に(Webメソッドパラメータとしてではなく)WSに渡す必要があります。もう一方の端のWSは、文字列を取得して使用できる必要があります。これはどのように達成できますか?

次の方法でサービスを呼び出します。

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

必要なのは、最初の行の前にコードを配置することです。これにより、myClassPortを介してリモートメソッドを呼び出すたびに、クライアントがこの「cookie」文字列を送信するようになります。どうも。

4

2 に答える 2

7

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

したがって、WebサービスでCookieまたはHTTPセッションを使用しないでください。応答の一部としてトークンIDを返します。その後、クライアントはそれを次のリクエストと一緒に送信できます。

ともかく:

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

サーバー側

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

を実装する必要はありませんjavax.xml.rpc.server.ServiceLifecycle。Webサービスで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();

     }
}
于 2012-04-18T16:44:30.513 に答える
0

この質問には誤解を招くような答えがいくつかあるので、現在のベストプラクティスを強調しようと思います。これらの提案のほとんどは、OWASPセキュリティガイドラインの一部であり、Web開発に取り組んでいる人は誰でもレビューすることを強くお勧めします。

1)常に一時的な(セッションスコープの)Cookieを使用します。

2)すべてのCookieを保護し、暗号化する必要があります。

3)リクエストペイロードでトークンを渡さないでください

4)サーバーに返送される可能性のあるデータを返す要求の場合は、応答にナンス(使い捨てトークン)を含めます。

5)後のリクエストには、ナンスとクッキーを含める必要があります(必須)

繰り返しになりますが、OWASPガイドラインを確認し、それに応じて続行することをお勧めします。認証にサービスプロバイダーを使用することを検討することをお勧めします。これは、すべてが正しくなければならない文字通り100万の詳細があるため、独自のソリューションを作成するよりもはるかに賢明です。Auth0.comはその1つです。

于 2018-04-20T19:39:47.263 に答える