使用jaxws建立webservice客户端并实现soap消息的handler验证示例
程序员文章站
2024-02-23 21:39:58
因项目需要,将之前使用过的webservice重新捡了起来,并且这次选择了使用不需要jar包的java原生jaxws。首先是wsimport的用法,先分享我的用法:cmd下...
因项目需要,将之前使用过的webservice重新捡了起来,并且这次选择了使用不需要jar包的java原生jaxws。首先是wsimport的用法,先分享我的用法:cmd下先转到工程所在路径,然后运行以下命令
复制代码 代码如下:
wsimport -keep -extension -s ./src -p com.jaxws.test http://192.168.1.1:8080/service?wsdl
在com.jaxws.test的包下就能找到自动生成的各种客户端相关辅助类。这些类怎么用就不细说了,网上很多资料。然后就是自己编写调用类(我这里只是一个方法,会被调用到就行)
复制代码 代码如下:
public string jaxws(object[] opargs)
{
servicesservice service=new servicesservice();
//向soap添加表头
service.sethandlerresolver(new handlerresolver(){
public list<handler> gethandlerchain(portinfo portinfo) {
list<handler> handlerlist = new arraylist<handler>();
//添加认证信息
handlerlist.add(new clienthandler());
return handlerlist;
}
});
string result =service.getservicesport().getresults(opargs.tostring());
//得到结果
system.out.println(result);
return result;
}
注意到这里的【//添加认证信息 handlerlist.add(new clienthandler());】,所以我们还需要新建一个clienthandler类来实现认证消息的组装,如下:
复制代码 代码如下:
package com.jaxws.test;
import java.util.set;
import javax.xml.namespace.qname;
import javax.xml.soap.*;
import javax.xml.ws.handler.messagecontext;
import javax.xml.ws.handler.soap.soaphandler;
import javax.xml.ws.handler.soap.soapmessagecontext;
public class clienthandler implements soaphandler<soapmessagecontext> {
public boolean handlemessage(soapmessagecontext ctx) {
//出站,即客户端发出请求前,添加表头信息
boolean request_p=(boolean)ctx.get(messagecontext.message_outbound_property);
if(request_p){
try {
soapmessage msg=ctx.getmessage();
soapenvelope env=msg.getsoappart().getenvelope();
soapheader hdr=env.getheader();
if(hdr==null) hdr=env.addheader();
//添加认证信息头
//qname(string namespaceuri, string localpart, string prefix)
//qname(string namespaceuri, string localpart)
//qname(string localpart)
//@param namespaceuri:qname的名称空间
//@param localpart:qname的本地部分
//@param prefix:qname的前缀
qname name=new qname("http://csdc.info/", "authentication", "wsse");
soapheaderelement header = hdr.addheaderelement(name);
//addchildelement(string localname, string prefix,string uri)
//addchildelement(string localname, string prefix)
//addchildelement(string localname)
//@param uri:新元素所属空间名称uri
//@param localname:新元素的本地名称
//@param prefix:新元素名称的空间前缀
//见jdk 1.6的api
soapelement userelement = header.addchildelement("username", "wsse");
userelement.addtextnode("admin");
soapelement passelement = header.addchildelement("password", "wsse");
passelement.addtextnode("admin");
msg.savechanges();
//把soap消息输出到system.out,即控制台
msg.writeto(system.out);
return true;
} catch (exception e) {
e.printstacktrace();
}
}
return false;
}
@override
public boolean handlefault(soapmessagecontext context) {
// todo auto-generated method stub
return false;
}
@override
public void close(messagecontext context) {
// todo auto-generated method stub
}
@override
public set<qname> getheaders() {
// todo auto-generated method stub
return null;
}
}
这个类就把所有的soap消息都加上了一个头消息,我这里的头消息如下:
复制代码 代码如下:
<wsse:authentication xmlns:wsse="http://csdc.info/">
<wsse:username>admin</wsse:username>
<wsse:password>admin</wsse:password>
</wsse:authentication>
这样就实现了带soap头认证的基于jaxws的webservice客户端。
下一篇: CANOpen过程数据对象报文