2009-04-01 3 views
15

私はCXF User Guideを使って動作させようとしましたが、運がなかった。CXFフレームワークを使用してHTTP基本認証で保護されたWebサービスをどのように消費しますか?

私はJavaコードを使用してWebサービスを呼び出そうとしています。

+0

このリンクはhttp://www.brimllc.com/2011/04/apache-cxf-client-setting-http-request-header-for-basic-authentication/comment同じ問題を解決するために私を助けました-page-1 /#comment-4313 –

答えて

24

これは、JAX-WS仕様の対象です。基本的に、要求コンテキストのプロパティとしてユーザー名/パスワードを設定します。

((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.USERNAME_PROPERTY, "joe"); 
((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.PASSWORD_PROPERTY, "pswd"); 

実行時には、HTTPヘッダーにそれらが格納されます。

もっと良い方法があり
+5

CXFポートをキャストするだけでよいことに言及する価値はあります:BindingProvider portBP =(BindingProvider)port;portBP.getRequestContext()。put(BindingProvider.USERNAME_PROPERTY、 "username");portBP.getRequestContext()。put(BindingProvider.PASSWORD_PROPERTY、 "password"); – Francois

6

WSDLからJavaを生成する際に、オプションを追加し、 "真の-exsh":

WSDL2Javaの-exsh真-pのedu.sharif.ce http://wsdl.ir/WebServices/WebService.asmx?WSDL

UserCredentials user = new UserCredentials(); 
user.setUserid("user"); 
user.setPassword("pass"); 

ResearchWebService_Service service = new ResearchWebService_Service(); 
ResearchWebService port = service.getResearchWebService(); 
port.addNewProject(newProject, user); 
+0

HTTPリクエストヘッダーでBasic認証を有効にしてもよろしいですか?これはおそらく認証HTTPヘッダーを設定するのではなく、SOAPメッセージの中に資格を設定するでしょう。(文書が '暗黙的なSOAPヘッダー'で動作すると言うように) – Geert

7

独自の認証プロバイダを提供することができます。そうすれば、WDSL自体が基本的なHTTP認証によって保護されている場合にも動作します。

@WebServiceRef(wsdlLocation = "https://laka/sito?wsdl") 
static XxxService service; 

public static void main(String[] args) { 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("user", "password".toCharArray()); 
     } 
    }); 

    service = new XxxService(); 
    Xxx port = service.getXxxPort(); 

    // invoke webservice and print response 
    XxxResponse resp = port.foo(); 
    System.out.println(resp.toString()); 

} 
+0

'Authenticator.setDefault(Authenticator)'メソッドは静的であり、すべてのスレッドに適用されます。しかし、スレッドごとに異なる認証情報を保存するために 'ThreadLocal'変数を使用することでこれを回避するのは簡単です。 – Marco

+1

'Authenticator.setDefault'は静的ですが、同期メソッドでもあります。本当にThreadLocalを使用する必要がありますか? –

関連する問題