为了账号安全,请及时绑定邮箱和手机立即绑定

Spring-WS SOAP 标头前缀问题

Spring-WS SOAP 标头前缀问题

杨魅力 2021-09-29 11:02:34
我正在处理一个 Spring-WS 项目,我正在尝试使用某个 SOAP 服务,但是我遇到了请求的 Header 标记的一些问题。PS:我在 SOAP UI 上运行了相同的请求,它运行良好。这是我运行的代码:JAXBElement<ChangeOtherIDsRequestType> request = createRequestBody();    WebServiceTemplate template = new WebServiceTemplate(marshaller);    template.setDefaultUri(URI);    @SuppressWarnings({ "unchecked" })    JAXBElement<ChangeOtherIDsResponseType> response = (JAXBElement<ChangeOtherIDsResponseType>) template            .marshalSendAndReceive(request, new WebServiceMessageCallback() {                @Override                public void doWithMessage(WebServiceMessage message) {                    Instant instant = Instant.now();                    SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;                    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();                    SOAPPart soapPart = soapMessage.getSOAPPart();              此代码应该在请求中添加 Header 标记,它用于通过“用户名”和“密码”对用户进行身份验证。让我们看看我的结果中缺少一些东西,例如:“密码”和“随机数”标签上的“wsse”前缀。“用户名”标签上的“用户名令牌”属性。“Nonce”标签的值。我在尝试解决这些问题时遇到了一些问题,但我仍然有一些问题:当我尝试将“wsse”前缀添加到“Username”和“Nonce”标签时:整个“Header”标签消失了。(我使用了与“用户名”标签相同的技术)SOAP UI 如何生成“Nonce”值?SOAP UI 如何生成“UsernameToken”值?最后的手段,是否有另一种方式来模拟 SOAP UI 请求?
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您正在尝试将安全性强加到您的请求中,而有一个拦截器和默认方式来做到这一点。配置Wss4jSecurityInterceptor你的WebServiceTemplate。


像下面这样的东西应该可以解决问题。


@Bean

public Wss4jSecurityInterceptor securityInterceptor() {

  Wss4jSecurityInterceptor interceptor = new Wss4jSecurityInterceptor();

  interceptor.setSecurementUsername("username");

  interceptor.setSecurementPassword("password");

  interceptor.setSecurementUsernameTokenNonce(true);

  interceptor.setSecurementActions("UsernameToken Timestamp");

  return interceptor;

}

然后将其注入您的WebServiceTemplate. 这应该添加所需的标题,而您无需执行任何其他操作。理想情况下,您会配置WebServiceTemplate一次并重复使用它。


@Bean

public WebServiceTemplate webServiceTemplate(Marshaller marshaller) {

    WebServiceTemplate wsTemplate = new WebServiceTemplate(marshaller);

    wsTemplate.setInterceptors(new ClientInterceptor[]{ securityInterceptor() });

    return wsTemplate;

}

然后使用WebServiceTemplate代码中的预配置。


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 272 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信