javax.xml.ws.Service在构造函数中失败,因为site具有用户名/密码

时间:2013-05-17 09:38:27

标签: java web-services authentication http-get

我想访问一个Web服务,这就是代码的样子:

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);

初始化'service'的行会引发401 Unauthorized异常。

如果我访问

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());
}
});

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要获取服务端点。使用端点get 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);