2013-05-17 56 views
1

我要訪問一個Web服務,這是代碼的樣子:javax.xml.ws.Service在構造函數中失敗,因爲網站擁有用戶名/密碼

URL url = new URL("http://localhost:8080/sample?ver_=1.0"); 

QName qname = new QName("http://webservices.sample.com/sample", "sample"); 

javax.xml.ws.Service service = javax.xml.ws.Service.create(url, qname); 

初始化「服務」投行401未經授權的例外。

如果我使用的瀏覽器訪問

http://localhost:8080/sample?ver_=1.0 

,一個窗口,詢問用戶名和密碼彈出。

我試圖使用Wireshark捕獲數據包,並注意到服務的構造函數發送一個HTTP Get到IP地址但沒有憑據。

如何確保服務構造函數對HTTP Get的調用包含用戶名/密碼?

我已經試圖把這個電話之前,但它並沒有幫助

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

謝謝!

+0

是使用基本身份驗證服務器?數據包中的認證頭是什麼? –

+0

是的,它的基本認證。這在標題上:Authorization:Basic racumin

回答

0

您需要獲取服務端點。使用端點得到的RequestContext並添加認證頭,這裏是示例代碼,根據您的Web服務和身份驗證憑據修改。

Example example = service .getXXXPort(); 

Map<String, Object> req_ctx = ((BindingProvider)example).getRequestContext(); 
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "your web service URL here"); 

Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("Username", Collections.singletonList("username")); 
headers.put("Password", Collections.singletonList("password")); 
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
相關問題