【问题标题】:How to obtain username and password from SoapUI Auth Tab (HTTP Headers) in a Spring-WS Interceptor?如何从 Spring-WS 拦截器中的 SoapUI Auth Tab(HTTP Headers)获取用户名和密码?
【发布时间】:2015-04-17 14:17:41
【问题描述】:

我正在使用 spring-ws,我需要对我的 web 服务调用执行简单的用户名和密码验证。为此,我需要获取用户名和密码的默认肥皂头属性。我不知道如何用 spring-ws 做到这一点,我花了很多时间试图弄清楚。

我正在使用 SoapUI 并通过在“Aut”选项卡中设置来发送用户名和密码。

我的拦截器拦截了我的调用,但我已经调试了 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;
}

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

非常感谢。

【问题讨论】:

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


    【解决方案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?

    谢谢你

    【讨论】:

    • 也许你应该更新你的问题,因为它指的是 SOAP 标头,而不是 HTTP 标头。
    • @Andreas-Veithen 你是对的,我刚刚修好了。谢谢。
    【解决方案2】:
    SOAPMessage soapMessage = context.getMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
    soapEnvelope.getHeader();
    

    【讨论】:

    • 答案不是(仅)一堆代码。需要解释出了什么问题以及答案是如何工作的......
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多