2012-10-15 109 views
4

我有WSDL。我需要製作HTTP基本(搶先式)身份驗證。 怎麼辦?java Apache Cxf HTTP身份驗證

我想:

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

但它不工作:

產生java.io.IOException:由造成服務器返回的HTTP響應代碼:401網址..

PS我使用Apache CXF 2.6.2和JBoss 5.0.1

+1

不知道爲什麼有人downvoted這個問題。我也有同樣的問題 – Andremoniy

回答

15

你指定的認證是不夠的。你應該做這樣的事情:

private YourService proxy; 

public YourServiceWrapper() { 
    try { 
     final String username = "username"; 
     final String password = "password"; 
     Authenticator.setDefault(new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(
         username, 
         password.toCharArray()); 
      } 
     }); 
     URL url = new URL("http://yourserviceurl/YourService?WSDL"); 
     QName qname = new QName("http://targetnamespace/of/your/wsdl", "YourServiceNameInWsdl"); 
     Service service = Service.create(url, qname); 
     proxy = service.getPort(YourService.class); 
     Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext(); 
     requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString()); 
     requestContext.put(BindingProvider.USERNAME_PROPERTY, username); 
     requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 
     Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
     requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
    } catch (Exception e) { 
     LOGGER.error("Error occurred in web service client initialization", e); 
    } 
} 

屬性:

  1. YourService - 您生成的Web服務客戶端界面。
  2. YourServiceWrapper() - 初始化您的服務的包裝類構造函數。
  3. url - 帶有?WSDL擴展名的Web服務的URL。
  4. qname - 第一個構造函數參數:來自WSDL文件的目標命名空間。第二:您的服務名稱爲WSDL

然後你就可以調用Web服務的方法是這樣的:

proxy.whatEverMethod();