Java 使用WSS4J return保护web服务调用;处理时发现错误<;wsse:安全性>;标题“;

Java 使用WSS4J return保护web服务调用;处理时发现错误<;wsse:安全性>;标题“;,java,ws-security,wss4j,Java,Ws Security,Wss4j,我正在尝试使用WSS4J将密码摘要WS-Security位添加到来自客户端的web服务调用中。我使用Axis的WSDL4J从WSDL生成了客户机类,并按照说明使用WSS4J将WS-Security的“密码摘要”头添加到SOAP消息中,但返回错误消息“处理头时发现错误”。添加调试消息后,我的CallbackHandler看起来不会被击中。我做错什么了吗?还是我遗漏了WSS4J文档中无法解释的一些设置 class-CSProvider{ 公共CS get(CSService、URL、字符串用户名)

我正在尝试使用WSS4J将密码摘要WS-Security位添加到来自客户端的web服务调用中。我使用Axis的WSDL4J从WSDL生成了客户机类,并按照说明使用WSS4J将WS-Security的“密码摘要”头添加到SOAP消息中,但返回错误消息“处理头时发现错误”。添加调试消息后,我的CallbackHandler看起来不会被击中。我做错什么了吗?还是我遗漏了WSS4J文档中无法解释的一些设置

class-CSProvider{
公共CS get(CSService、URL、字符串用户名)
抛出ServiceException{
CS csPort=csService.getCSPort(url);
((存根)csPort)。\u setProperty(WSHandlerConstants.ACTION,WSHandlerConstants.USERNAME\u令牌);
((存根)csPort)。\u setProperty(WSHandlerConstants.USER,用户名);
((存根)csPort)。_setProperty(UsernameToken.PASSWORD_类型,WSConstants.PW_摘要);
((存根)csPort)。_setProperty(WSHandlerConstants.PW_CALLBACK_类,“com.example.namespace.to.PasswordCallbackHandler”);
返回csPort;
}
}
公共类PasswordCallbackHandler实现CallbackHandler{
@凌驾
公共无效句柄(回调[]回调)引发IOException,UnsupportedCallbackException{
for(回调:回调){
if(WSPasswordCallback的回调实例){
((WSPasswordCallback)callback).setPassword(PasswordStore.getPassword());
}否则{
抛出新的UnsupportedCallbackException(回调);
}
}
}
}

经过反复摸索,我发现了这个问题。正如我所预料的,web服务请求在未通过
PasswordCallbackHandler
的情况下发出,因此它们返回时带有来自远程服务器的给定错误消息,远程服务器需要有效的身份验证凭据。我花了一段时间确定我需要构造服务定位器(
csService
,在本例中),如下所示:

使用client_deploy.wsdd文件,如下所示:


然后从
CSProvider.get()
设置属性就可以了

我避免使用wsdd文件,因为我看到的所有其他示例都使用它来设置username和password类——这两件事在运行时之前我都不知道。明智的一句话:当文档说可以使用
\u setProperty()
方法而不是wsdd文件时,它的意思只是为了设置这些属性,而不是完全替换文件

CSService csService = new CSServiceLocator(new FileProvider("client_deploy.wsdd"));