SOAP服务客户端不会为基本身份验证发送Mime标头

时间:2015-06-30 11:35:37

标签: java web-services soap basic-authentication

一些背景知识:这是Weblogic Web服务创建的服务客户端通过Eclipse创建的。我相信这会在幕后使用clientgen。

我尝试进行需要抢先式基本身份验证的SOAP调用。请求正在发送,但Mimeheaders我设置的不是它。通话的接收者告诉我,请求本身正在通过,但我设置的任何mimeheaders都没有。

服务电话很简单。

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。如果我设置一个断点并在它离开handleMessage方法之前查看mime标题,我可以看到它们被设置了。

我能够在SoapUI中调用请求并获得响应。我设置了抢占式基本身份验证,它运行正常。当我通过Java客户端发送请求时,我得不到任何响应,并且实际上收到错误消息,指出它的内容类型不正确。我认为这个错误指的是错误响应,因为我实际上没有得到响应(也没有触及处理程序中的handleMessage()方法)并且我知道请求是通过text / xml进行的这就是错误所要求的。

我不确定它是否与先发制人&#34;有关。需求?有没有办法将这种基本身份验证设置为先发制人?

思考? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Basic Auth在HTTP层而不是SOAP层完成,因此您需要配置底层HTTP库。 (MIME标头与它无关)

例如,对于CXF,请查看此问题HTTP basic authentication through CXF interceptor not working