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

因项目需要,将之前使用过的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客户端。

时间: 2024-10-02 23:36:22

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

java cxf开发webservice,如何查看soap消息

问题描述 我在网上查看如何查看我客户端和服务端往来的soap消息?不用工具,我想查看具体消息soap.我在网上零星看到有用拦截器的,但是我也加上了,还是不能在控制台看到soap.看看我哪里错了,说明一下webservice从客户端已经成功调用了服务端的接口.贴代码客户端的配置文件<importresource="classpath:META-INF/cxf/cxf.xml"/><importresource="classpath:META-INF/cxf/c

利用WebSphere Process Server v6.2.0.1 中的JAX-WS绑定传递SOAP消息附件

前言 Web 服务是目前 SOA 实现中的关键技术之一.新版本的 WebSphere Process Server (WPS) v6.2.0.1 在支持原有 JAX-WS 绑定的基础上,增加了对未被引用(unreferenced)SOAP 消息附件的支持,如下图 1 所示. 图 1. SOAP 消息附件转换 WPS 运行时的 JAX-WS Web 服务绑定能够捕获 SOAP 消息附件并将之附加到 SMO(Service Message Object)中的附件部分,该附件可以随着 SMO 在 SC

Socket模拟SOAP消息

问题的提出: 我做了一个图书管理系统,是用三层结构实现的,客户端,服务器处理端和数据端.客户端提出请求,服务器端响应,同时将从数据服务器得来的结果以SOAP消息发送回客户端,客户端解析SOAP消息,将结果显示给用户. 实现方法: 好了,话不多说,现在开始进入正题: 在接到客户端发来的请求后,我用ADO连接数据服务器并查询(我用的是Access),得到结果集Recordset以后,将结果集中有关图书信息格式化成XML文档,将其以SOAP消息形式发送回客户端 //******************

soap消息中的SoapAction应该使用wsdl中的哪一个?

问题描述 soap消息中的SoapAction应该使用wsdl中的哪一个? 在wsdl的binding中有如下内容 那么客户端发送的soap消息中的SoapAction到底是哪一个呢? 还有wsdlsoap:body use="literal"这一句是什么意思呢? 解决方案 是后缀为Request的还是Response的呢?

jax-ws之webservice security(安全)教程第三天

前言: 在今天的学习中,我们讲开始过渡到一个真正的websecurity例子. 第二天中我们知道了如何使用handler来处理客户端提交上来的用户名与密码,而在今天的学习中,我们将会使用服务端预先配置的用户名与密码来authenticate客户端提交上来的值. 相对于第二天的学习,如果客户端提交的用户名与密码输错,但还是能够与服务端建立http连接来说,第三天中的例子的安全性则更高,当客户端提交上来的用户名与密码错误则更本不可能和服务端建立起有效的http连接.该例子同时适用于一切J2EE Ap

浅析WebService客户端应用方法

web|客户端 .NET平台内建了对Web service的支持,包括Web service的构建和使用. 与其它开发平台不同,使用.NET平台,你不需要其他的工具或者SDK就可以完成Web service的开发了..NET Framework本身就全面支持Web service,包括服务器端的请求处理器和对客户端发送和接受SOAP消息的支持.本文将带你用.NET创建和使用Web service. 一 在.NET中创建Web service 要在.NET中创建Web service,你只需在你的

jax-ws之webservice security(安全)教程第一天

前言: 在前面的"5天学会jaxws-webservice教程",我们讲了基本的jax-ws的使用. Jax-ws是业界公认的标准的webservice,它已经成为了一个行业界标准,包括cxf,其实cxf也是调用的jax-ws为标准的基于spring的webservice框架. 同时,大家都知道世界上除了j2ee体系外,还存在.net体系,同时有过相关经验的同事们也知道用ws-security无非就是涉及到"加密","解密",而JAVA的x509

jax-ws之webservice security(安全)教程第二天

前言: 第一天里说了如何用jax-ws去结合ssh框架. 在今天的教程中将会向大家详细讲述一个ws-security中的一个传统的"基于handler"来认证客户端传来的用户名密码的webservice. 客户端传过来一对用户名和密码,服务端进行认证. 当然,我们此处说这个用户名和密码的传送,那可不是用下面的这种形式来传送的哦:  http://xxx.do?username=xxx&password=xxx. 我们这个用户名和密码是带在soap报文中的, jax-ws用一个h

web service-cxf webservice客户端访问报错!

问题描述 cxf webservice客户端访问报错! 10C Exception in thread ""main"" javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader. at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157) at com.sun.proxy.$Proxy38.goLo