猿问

Spring-WS SOAP 标头前缀问题

我正在处理一个 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 请求?


杨魅力
浏览 273回答 1
1回答

qq_笑_17

您正在尝试将安全性强加到您的请求中,而有一个拦截器和默认方式来做到这一点。配置Wss4jSecurityInterceptor你的WebServiceTemplate。像下面这样的东西应该可以解决问题。@Beanpublic Wss4jSecurityInterceptor securityInterceptor() {&nbsp; Wss4jSecurityInterceptor interceptor = new Wss4jSecurityInterceptor();&nbsp; interceptor.setSecurementUsername("username");&nbsp; interceptor.setSecurementPassword("password");&nbsp; interceptor.setSecurementUsernameTokenNonce(true);&nbsp; interceptor.setSecurementActions("UsernameToken Timestamp");&nbsp; return interceptor;}然后将其注入您的WebServiceTemplate. 这应该添加所需的标题,而您无需执行任何其他操作。理想情况下,您会配置WebServiceTemplate一次并重复使用它。@Beanpublic WebServiceTemplate webServiceTemplate(Marshaller marshaller) {&nbsp; &nbsp; WebServiceTemplate wsTemplate = new WebServiceTemplate(marshaller);&nbsp; &nbsp; wsTemplate.setInterceptors(new ClientInterceptor[]{ securityInterceptor() });&nbsp; &nbsp; return wsTemplate;}然后使用WebServiceTemplate代码中的预配置。
随时随地看视频慕课网APP

相关分类

Java
我要回答