Java 我应该应用什么WS-Security设置来连接到wsdl描述的SOAP服务?

Java 我应该应用什么WS-Security设置来连接到wsdl描述的SOAP服务?,java,wsdl,cxf,webservice-client,ws-security,Java,Wsdl,Cxf,Webservice Client,Ws Security,我的任务是为特定的web服务创建java客户端,该web服务由以下wsdl文件描述: https://localhost:442/Services/Person.svc 我使用Apache CXF的wsdl2java创建了java客户端,并在客户端调用中使用了新的AddressingFeature(true),因为服务是HTTPS格式的,如下所示: Person p = new Person(); IPersonService iPersonService = p.getWSHttpBind

我的任务是为特定的web服务创建java客户端,该web服务由以下wsdl文件描述:


https://localhost:442/Services/Person.svc
我使用Apache CXF的wsdl2java创建了java客户端,并在客户端调用中使用了
新的AddressingFeature(true)
,因为服务是HTTPS格式的,如下所示:

Person p = new Person();
IPersonService iPersonService = p.getWSHttpBindingIPersonService(new AddressingFeature(true));
System.out.println(iPersonService.getSomething());
但我有以下例外:

((BindingProvider) iPersonService).getRequestContext() 
   .put("ws-security.username", "user"); 
((BindingProvider) iPersonService).getRequestContext() 
   .put("ws-security.password", "password"); 
org.apache.cxf.binding.soap.SoapFault:无法处理该消息。这很可能是因为操作“”不正确,或者是因为消息包含无效或过期的安全上下文令牌,或者是因为绑定之间不匹配。如果服务因不活动而中止通道,则安全上下文令牌将无效。为了防止服务过早中止空闲会话,请增加服务端点绑定上的接收超时

到目前为止,我已经尝试添加
ws-security.username
ws-security.password
这样的内容,但没有成功,我得到了相同的异常:

((BindingProvider) iPersonService).getRequestContext() 
   .put("ws-security.username", "user"); 
((BindingProvider) iPersonService).getRequestContext() 
   .put("ws-security.password", "password"); 
所以,很可能我没有应用某种安全设置。有人能描述一下我应该为这个特定的wsdl应用什么样的WS-Security设置吗

更新:

添加了xsd模式:

我使用GlassFishMetro和Netbeans来使用类似的服务。这里有一个很好的指南:

创建web服务客户端后,您可以在web服务引用文件夹中看到它,右键单击它并选择“编辑web服务属性…”。在弹出窗口中,您可以输入登录详细信息


在servlet中,您可以使用编写的代码访问Person。

我使用Glassfish Metro和Netbeans来使用类似的服务。这里有一个很好的指南:

创建web服务客户端后,您可以在web服务引用文件夹中看到它,右键单击它并选择“编辑web服务属性…”。在弹出窗口中,您可以输入登录详细信息


在servlet中,您可以使用编写的代码访问Person。

CXF支持这种安全策略。事实上,它目前正在测试中,请参见此处:


与在CXF中使用“ws-security.username”和“ws-security.password”不同,您需要使用“ws-security.username.sct”和“ws-security.password.sct”。这指定将这些值用于引导策略。

CXF支持此类安全策略。事实上,它目前正在测试中,请参见此处:


与在CXF中使用“ws-security.username”和“ws-security.password”不同,您需要使用“ws-security.username.sct”和“ws-security.password.sct”。这指定将这些值用于引导策略。

问题如下:

  • 我没有意识到,如果我不使用
    cxf-rt-ws-policy
    dependency,那么WSDL的策略设置就会被默默地忽略。为了解决这个问题,我已经将它添加到我的
    pom.xml
    (或者您可以添加整个捆绑包-
    cxf捆绑包
    包),从那里开始,我有了另一个例外,但无论如何,这就是进展

  • 在此之后,我得到了一个例外,即“未提供用户名”,尽管我在
    cxf.xml
    中有它。问题是我使用了错误的
    jaxws:client
    name属性。我已经使用了服务名称,但是您必须使用端口名称(您可以在wsdl文件的末尾找到),并且您还必须为该客户机使用
    createdFromAPI
    属性。所以,最后应该是这样的:


问题如下:

  • 我没有意识到,如果我不使用
    cxf-rt-ws-policy
    dependency,那么WSDL的策略设置就会被默默地忽略。为了解决这个问题,我将它添加到我的
    pom.xml