这将设置基本 HTTP 身份验证的用户名和密码。如果您已经在SoapUI中对其进行了测试,我猜您所说的“PasswordText”值是请求详细信息窗格中的“WSS-Password Type”。这设置了 WSS 安全性,而不是 HTTP 安全性。
使用 Java6 中的 JAX-WS,您需要附加一个 SOAPHandler 以将 WSS-Usertoken 注入到 SOAP Header 中。关于这个网络有很多零碎的东西,但我找不到一个单一的链接来发布,所以这里有一些代码来让你继续前进......
要添加处理程序,您需要类似下面的内容:
final Binding binding = ((BindingProvider) servicePort).getBinding();
List<Handler> handlerList = binding.getHandlerChain();
if (handlerList == null)
handlerList = new ArrayList<Handler>();
handlerList.add(new SecurityHandler());
binding.setHandlerChain(handlerList); // <- important!
然后,安全处理员类将做契约。处理程序是一般的东西,对于成功的消息和错误都被调用,但也许更重要的是,它们在两个消息方向上都被调用 - 对于传出请求,然后再次为传入响应。您只想处理传出邮件。因此,您需要类似以下内容的内容:
public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> {
...
@Override
public boolean handleMessage(final SOAPMessageContext msgCtx) {
// Indicator telling us which direction this message is going in
final Boolean outInd = (Boolean) msgCtx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// Handler must only add security headers to outbound messages
if (outInd.booleanValue()) {
try {
// Get the SOAP Envelope
final SOAPEnvelope envelope = msgCtx.getMessage().getSOAPPart().getEnvelope();
// Header may or may not exist yet
SOAPHeader header = envelope.getHeader();
if (header == null)
header = envelope.addHeader();
// Add WSS Usertoken Element Tree
final SOAPElement security = header.addChildElement("Security", "wsse",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
final SOAPElement userToken = security.addChildElement("UsernameToken", "wsse");
userToken.addChildElement("Username", "wsse").addTextNode("MyWSSUsername");
userToken.addChildElement("Password", "wsse").addTextNode("MyWSSPassword");
} catch (final Exception e) {
LOG.error(e);
return false;
}
}
return true;
}
...
// Other required methods on interface need no guts
}
我在这里做了一些假设,但希望它能让你继续前进!
亲切问候。