如何从Spring-WS Interceptor中的SoapUI Auth Tab(HTTP标头)获取用户名和密码?

时间:2015-02-16 23:26:30

标签: java spring web-services soap spring-ws

我正在使用spring-ws,我需要在我的webservice调用上执行简单的用户名和密码验证。为此,我需要获取用户名和密码的默认soap标头属性。我不知道如何用spring-ws做到这一点,我花了很多时间试图解决这个问题。

我正在使用SoapUI并通过在“自动”标签中设置用户名和密码来发送用户名和密码。

我的拦截器拦截了我的调用,但我调试了messageContext,我不知道这些字段在哪里。

这是我的代码,它永远不会进入while中的代码,因此迭代器在hasNext中返回false。

 @Override
 public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
   logger.info("Intercepting call");
   SoapMessage soapMessage = (SoapMessage) messageContext.getRequest();
   SoapHeader soapHeader = soapMessage.getSoapHeader();

   Iterator<SoapHeaderElement> it = soapHeader.examineAllHeaderElements();
   while(it.hasNext()) {
    SoapHeaderElement element = it.next();
    QName qname = element.getName();
    logger.info("QName: " + qname.getLocalPart());
    logger.info("Value? " + soapHeader.getAttributeValue(qname));
  }

return true;
}

如果您愿意指出我有关该主题的任何文档,或者更好的是,一些示例,这将是一个很大的帮助。

非常感谢。

2 个答案:

答案 0 :(得分:1)

好的,所以我认为我找到了答案,我的问题不是代码,而是SoapUI的eclipse插件,它并没有真正发送授权标题。我已经下载了桌面客户端,配置正确,现在我看到了标题。

启用后,我编写了此代码,并且能够获取用户和密码:

TransportContext transportContext =  TransportContextHolder.getTransportContext();
HttpServletRequest servletRequest = ((HttpServletConnection) transportContext.getConnection()).getHttpServletRequest();
String authorizationHeader = servletRequest.getHeader("authorization");
String userAndPasswordBase64 = authorizationHeader.substring("Basic ".length());
String userAndPassword = new String(Base64.decodeBase64(userAndPasswordBase64));

int colonIndex = userAndPassword.indexOf(':');
String user = userAndPassword.substring(0, colonIndex);
String password = userAndPassword.substring(colonIndex + 1);

这个问题真正帮助我解决了这个问题:How to access HTTP headers in Spring-ws endpoint?

谢谢你

答案 1 :(得分:0)

SOAPMessage soapMessage = context.getMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
soapEnvelope.getHeader();