一些背景:这是通过Eclipse创建的Weblogic Web服务创建的服务客户端。我相信这会在后台使用clientgen。
我正在尝试进行需要抢占式基本身份验证的SOAP调用。该请求已发送,但我正在设置的Mimeheaders没有处理。通话的接收者已通知我,请求本身已通过,但我设置的任何mimeheader都没有。
服务呼叫非常简单。
DescriptionService service = new DescriptionService(wsdlLocation, new QName("urn:descriptionService.service.company.com", "DescriptionService"));
service.setHandlerResolver(new HandlerResolver() {
@SuppressWarnings("rawtypes")
@Override
public List<Handler> getHandlerChain(final PortInfo portInfo) {
final List<Handler> handlerList = new ArrayList<Handler>();
handlerList.add(new SOAPDescriptionServiceHeaderHandler());
return handlerList;
}
});
DescriptionServicePortType portType = service.getDescriptionServicePort();
DescriptionRequest request = new DescriptionRequest();
request.setId(id);
DescriptionResponse description = portType.describe(request);
处理程序是我设置Mimeheaders的地方:
@Override
public boolean handleMessage(final SOAPMessageContext context) {
final Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
final SOAPMessage message = context.getMessage();
if (outboundProperty.booleanValue()) {
try {
MimeHeaders mimeheaders = message.getMimeHeaders();
String encodedAuth = Base64.encode(new String("un:pw").getBytes());
mimeheaders.addHeader("Authorization", "Basic " + encodedAuth);
this.logMessage(message, outboundProperty.booleanValue(), false);
} catch (final Exception e) {
// Log Error
}
} else {
this.logMessage(message, outboundProperty.booleanValue(), false);
}
return true;
}
它确实命中了该处理程序并设置了mimeheaders。如果设置断点并在mime标头离开handleMessage方法之前查看它,则可以看到它们已设置。
我可以在SoapUI中调用请求并获得响应。我设置了抢占式基本身份验证,并且工作正常。当我通过Java客户端发送请求时,没有任何响应,实际上却收到一条错误消息,指出内容类型不正确。我相信这个错误是指错误响应,因为我实际上没有得到响应(也没有在处理程序中点击handleMessage()方法),而且我知道请求正在通过text / xml进行处理,错误要求。
我不确定是否与“抢先”要求有关?有没有一种方法可以将这种基本身份验证设置设置为抢先式?
有什么想法吗?
任何援助将不胜感激。
最佳答案
基本身份验证是在HTTP层而不是SOAP层完成的,因此您需要配置基础HTTP库。 (MIME标头与此无关)
以CXF为例,请看这个问题HTTP basic authentication through CXF interceptor not working