我已经使用JAX-WS RT开发了一个简单的Web服务,并将其部署在Tomcat 6服务器上。我需要使用SOAP标头中的ws-security对对我的Web服务的调用进行身份验证。

我的方法是使用链处理程序在soap标头中提取用户名和密码,并在我的代码中进行身份验证。这是正确的方法吗?如果不是,那么正确的方法是什么?

使用soapUI,我已通过以下标头发送

 <soapenv:Header>
  <wsse:Security soapenv:mustUnderstand="1"
  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
     <wsse:UsernameToken>
        <wsse:Username>test</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">test</wsse:Password>
     </wsse:UsernameToken>
  </wsse:Security>



与此头我得到以下错误
  <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
  <SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
     <faultstring>MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood</faultstring>
     <faultcode>SOAP-ENV:MustUnderstand</faultcode>
  </SOAP-ENV:Fault>


如何使用JAX-WS rt设置Web服务以接受这种类型的标头并进行身份验证。

最佳答案

使用链处理程序是处理ws-security标头的一种方法,与r​​amart之类的框架相比,它只是一种较低级别的方法(尽管这些框架通常只是为您实现这些处理程序)。如果编写自己的消息处理程序,则必须重写

Set<QName> getHeaders()

声明您了解的标头。在这种情况下,返回一个包含
QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security")

以避免出现“MustUnderstand”错误。

07-28 00:36
查看更多