Поиск по этому блогу

четверг, 13 декабря 2012 г.

Проблемная аутентификация с Axis

Недавно возникла потребность создания клиента с аутентификацией для веб сервиса с 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);

Комментариев нет:

Отправить комментарий