Недавно возникла потребность создания клиента с аутентификацией для веб сервиса с Axis.
При этом если следовать инструкции в самом acis достаточно прописать лишь:
// If authorization is required
service.setUsername(name);
service.setPassword(password);
А при билде получаем Exception
AxisFault
faultCode: {http://xml.apache.org/axis/}HTTP
faultSubcode:
faultString: (401)Unauthorized
faultActor:
faultNode:
faultDetail:
....
(401)Unauthorized
at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java)
Лечится это довольно просто: так как axis1 использует класс устаревший HTTPSender, в котором и возникает ошибка, то его можно заменить на CommonsHTTPSender.
Для этого в проект добавляем commons-httpclient-3.1.jar (именно 3.1,так как другие версии могут не содержать этот класс) и commons-codec.jar.
Для этого в классе, который наследует org.apache.axis.client.Service, добавляем метод
protected org.apache.axis.EngineConfiguration getEngineConfiguration() {
java.lang.StringBuffer sb = new java.lang.StringBuffer();
sb.append("\r\n");
sb.append("\r\n");
sb.append("\r\n");
sb.append("\r\n");
sb.append("\r\n");
sb.append("\r\n");
org.apache.axis.configuration.XMLStringProvider config =
new org.apache.axis.configuration.XMLStringProvider(sb.toString());
return config;
}
И вызываем его в конструкторе.
С Axis2 таких проблем уже нет.
После генерирования stub из WSDL достаточно прописать лишь:
Options options = stub._getServiceClient().getOptions();
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setPassword(password);
auth.setUsername(name);
options.setProperty(HTTPConstants.AUTHENTICATE,auth);