我正在使用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;
}
如果您愿意指出我有关该主题的任何文档,或者更好的是,一些示例,这将是一个很大的帮助。
非常感谢。
答案 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();