У меня возникли проблемы с настройкой заголовка авторизации HTTP для запроса веб-службы с использованием Apache CXF. У меня есть настройка клиента до весны:
<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean id="myHTTPAuthInterceptor" class="my.app.MyHTTPAuthInterceptor" autowire="constructor" />
<bean id="webServiceFactory" class="my.app.WebServiceFactory">
<property name="wsdlLocation" value="classpath:/my/app/webservice.wsdl" />
<property name="serviceURL">
<jee:jndi-lookup jndi-name="webservice/url" />
</property>
<property name="inInterceptors">
<list>
<ref bean="loggingInInterceptor" />
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="loggingOutInterceptor" />
<ref bean="myHTTPAuthInterceptor" />
</list>
</property>
</bean>
<bean id="myWebService" factory-bean="webServiceFactory" factory-method="getInstance" />
Заголовки устанавливаются через MyHTTPAuthInterceptor следующим образом:
public MyHTTPAuthInterceptor(ConfigDao configDao)
{
super(Phase.POST_PROTOCOL);
this.configDao = configDao;
}
@Override
public void handleMessage(Message message) throws Fault
{
Map<String, List<?>> headers = (Map<String, List<?>>) message.get(Message.PROTOCOL_HEADERS);
String authString = configDao.getUsername() + ":" + config.getPassword();
headers.put("Authorization", Collections.singletonList("Basic " + new String(Base64.encodeBase64(authString.getBytes()))));
}
С именем пользователя и обоими настройками «тест», в журналах все выглядит нормально:
Headers: {SOAPAction=[""], Accept=[*/*], Authorization=[Basic dGVzdDp0ZXN0]}
Однако сервер возвращает HTTP 401 :Unauthorized.
Не зная, что происходит не так, я применил совершенно другой подход, изменив заводской код клиента веб-службы. Я добавил базовую политику авторизации в канал клиента вот так:
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("test");
authorizationPolicy.setPassword("test");
authorizationPolicy.setAuthorizationType("Basic");
httpConduit.setAuthorization(authorizationPolicy);
Снова протестировал мою настройку, тот же журнал (в другом порядке, хотя):
Headers: {SOAPAction=[""], Authorization=[Basic dGVzdDp0ZXN0], Accept=[*/*]}
Теперь ответ сервера 200 OK!
Вы можете подумать, что проблема решена, но второй подход мне не подходит. Мое приложение представляет собой многопользовательскую среду -, все с разными именами пользователей и паролями. При втором подходе я не могу повторно использовать свой клиент.
Как я могу заставить мой перехватчик работать правильно? Я подключаюсь к неправильной фазе? Имеет ли значение порядок заголовков? Если да, то как мне его изменить?