使用AXIS2将用户/密码添加到SOAPHeader以进行WebService客户端调用

请帮助:我试图从SOAPUI调用WebService,我注意到该服务需要用户名和密码,我通过请求参数提供。 我注意到原始XML包含添加到SOAPHeader的用户/密码片段。 摘录如下:

testusertestpassword&RYadQak91mr7dB+5hyt8yw==2011-10-24T20:13:43.039Z  

现在我想通过添加用户/密码详细信息来实现同样的目的,如下面的代码所示:代码片段是:

 org.tempuri.myService.MyServiceStub stub = new org.tempuri.myService.MyServiceStub(); ServiceClient sc = stub._getServiceClient(); HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator(); auth.setUsername("testuser"); auth.setPassword("password$"); sc.getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE,auth); org.tempuri.myService.MyServiceDocument myService4 = (org.tempuri.myService.MyServiceDocument)getTestObject(org.tempuri.myService.MyServiceDocument.class); MyService lval = MyService4.addNewMyService(); MyServiceParameters lvParams = lval.addNewParameters(); lvParams.setA("24"); lvParams.setB("10"); lval.setParameters(lvParams); myService4.setMyService(lval); 

但我得到了Axis故障exception,需要帮助我在上面的代码中做错了。 轴故障exception详细信息:

 org.apache.axis2.AxisFault: Exception occurred while executing service 'MyService'. at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531) at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) at org.tempuri.myService.MyServiceStub.myService(MyServiceStub.java:182) at org.tempuri.myService.MyServiceTest.main(MyServiceTest.java:55) MyServiceResponseDocument lvdoc = stub.myService(myService4); 

我自己解决了这个问题,这段代码可能会帮助一些想要添加其他参数的人(至少这对我有用):

代码段如下:

 OMFactory omFactory = OMAbstractFactory.getOMFactory(); OMElement omSecurityElement = omFactory.createOMElement(new QName( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"), null); OMElement omusertoken = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"), null); OMElement omuserName = omFactory.createOMElement(new QName("", "Username", "wsse"), null); omuserName.setText("myusername"); OMElement omPassword = omFactory.createOMElement(new QName("", "Password", "wsse"), null); omPassword.addAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",null ); omPassword.setText("mypassword"); omusertoken.addChild(omuserName); omusertoken.addChild(omPassword); omSecurityElement.addChild(omusertoken); stub._getServiceClient().addHeader(omSecurityElement); 

对于其他任何正在努力使用无效安全标头的人 – 来自Shiv Gopal的答案对我不起作用 – 我收到了WSS1613:不支持安全标头内的UsernameToken元素。

在基本上将我的metro客户端与我的axis2客户端进行比较并将每个片段修改为1:1之后,它归结为:

更改

 OMElement omusertoken = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"), null); 

 OMElement omusertoken = omFactory.createOMElement(new QName(null, "wsse:UsernameToken", "wsse"), null); 

现在认证工作