欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用jaxws建立webservice客户端并实现soap消息的handler验证示例

程序员文章站 2024-02-26 18:02:34
因项目需要,将之前使用过的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客户端。