Java 我应该应用什么WS-Security设置来连接到wsdl描述的SOAP服务?
我的任务是为特定的web服务创建java客户端,该web服务由以下wsdl文件描述: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
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”。这指定将这些值用于引导策略。问题如下:
- 我没有意识到,如果我不使用
dependency,那么WSDL的策略设置就会被默默地忽略。为了解决这个问题,我已经将它添加到我的cxf-rt-ws-policy
(或者您可以添加整个捆绑包-pom.xml
包),从那里开始,我有了另一个例外,但无论如何,这就是进展cxf捆绑包
- 在此之后,我得到了一个例外,即“未提供用户名”,尽管我在
中有它。问题是我使用了错误的cxf.xml
name属性。我已经使用了服务名称,但是您必须使用端口名称(您可以在wsdl文件的末尾找到),并且您还必须为该客户机使用jaxws:client
属性。所以,最后应该是这样的:createdFromAPI
问题如下:
- 我没有意识到,如果我不使用
dependency,那么WSDL的策略设置就会被默默地忽略。为了解决这个问题,我将它添加到我的cxf-rt-ws-policy
pom.xml