描述:
最近做一个项目,需要调用webservice,服务端用xfire发布,客户端我打算用jdk的wsimport生成,xfire在发布服务时在SoapHeader里增加了安全认证, 客户端在调用时必须将认证参数封装到SoapHeader中才能通过认证。
发soap消息格式如下:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<AuthenticationToken>
<Username>abcd</Username>
<Password>1234</Password>
</AuthenticationToken>
</S:Header>
<S:Body>
<ns2:getUserList xmlns:ns2="http://www.application.org/jsr181" xmlns:ns3="http://bean.chinamobile.cn.com">
<requestId>214484f8-8a79-464a-9fcb-27491d219ce3</requestId>
<pn>1</pn>
<ps>10</ps>
</ns2:getUserList>
</S:Body>
</S:Envelope>
(1)环境准备
jdk: 1.6.25(没有用任何框架)
(2)创建RequesterCredentials.java(通过实现SoapHander往SoapMessage加SoapHeader)
package com.chinamobile.webservice.omae;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
/**
*
* @author mark
* VanceInfo
*/
public class RequesterCredentials implements SOAPHandler<SOAPMessageContext> {
private String _userName;
private String _password;
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public void close(MessageContext context) {
}
@Override
public boolean handleFault(SOAPMessageContext context) {
//TODO return true
return true;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
addRequesterCredentials(context);
//TODO return true
return true;
}
private void addRequesterCredentials(SOAPMessageContext context) {
Boolean outboundProperty = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
SOAPMessage message = context.getMessage();
try {
SOAPHeader header = message.getSOAPHeader();
if (header == null) {
message.getSOAPPart().getEnvelope().addHeader();
header = message.getSOAPHeader();
}
SOAPElement authenticationToken = header.addChildElement("AuthenticationToken","","");
SOAPElement userName = authenticationToken.addChildElement("Username").addTextNode(_userName);
SOAPElement password = authenticationToken.addChildElement("Password").addTextNode(_password);
//message.writeTo(System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
RequesterCredentials(){
_userName = "abcd";
_password = "1234";
}
RequesterCredentials(String userName,String password){
_userName = userName;
_password = password;
}
}
(3)创建HeaderHandlerResolver.java(调用RequesterCredentials)
package com.chinamobile.webservice.omae;
import java.util.ArrayList;
import java.util.List;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
public class HeaderHandlerResolver implements HandlerResolver {
@Override
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerChain = new ArrayList<Handler>();
//add header auth
handlerChain.add(new RequesterCredentials());
return handlerChain;
}
}
(3)webserivce client 端调用
//ClientFactory
public class ClientFactory {
public static UserService getUserServiceClient(){
try {
UserService_Service userService_Service =new UserService_Service();
userService_Service.setHandlerResolver(new HeaderHandlerResolver());
UserService userServiceClient = userService_Service.getUserServiceHttpPort();
return userServiceClient;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
参照资料:
(1)http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client
(2)${jdk_1.6.25}\sample\webservices
分享到:
相关推荐
接下来,在服务接口上使用`[SoapHeader]`特性声明SoapHeader参数,这样客户端在调用服务时就需要提供这个Header。在服务实现中,我们可以通过检查Header来验证用户身份。 ```csharp [WebService(Namespace = ...
webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用...
本方法是用axis1.4技术,实现java客户端调用webservice。已经可实现过可行的,如果不行可加我QQ号302633进行详细解析。
本教程将详细讲解客户端如何通过SOAP(Simple Object Access Protocol)请求调用WebService,以实现根据订单号获取订单的物流信息。 **SOAP请求详解** SOAP是一种XML(eXtensible Markup Language)格式的消息协议...
本教程将讲解如何使用Spring Boot集成Apache CXF(一个强大的Java Web Service框架)来构建服务端,并探讨两种Java客户端调用Web Service接口的方法。 首先,我们需要理解Spring Boot与CXF的整合。Spring Boot通过...
关于此代码的使用及相关配置,可以见此文:...代码开发时环境:Windows8.1、Visual Studio 2013、IIS8 注意:测试代码时,重新部署WebService服务且修改客户端测试程序的服务引用
Java WebService CXF客户端调用和服务端的实现是企业级应用程序中常见的通信方式,它基于标准的SOAP(Simple Object Access Protocol)协议,提供了一种在分布式环境中交换信息的方法。CXF是一个开源框架,它简化了...
WebService客户端调用WebService服务示例代码,java代码,纯手工,包括直接httpClient直接发送Saop报文调用和利用wsimport -keep 生成客户端代码后调用两种方式的示例。因涉及商务账户密码隐私,因此代码中的有些账号...
java axis客户端调用webservice,可应用于ofbiz框架。 解决网络上共享代码两次调用后会出现timeout的BUG
用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...
本文将深入探讨如何使用Axis2客户端调用WebService接口,并且会特别关注如何精简所需的jar包。 首先,了解Axis2客户端的基本概念是至关重要的。Axis2客户端是用于与远程Web服务交互的工具,它允许开发者通过SOAP...
当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户能够访问服务。 首先,理解身份认证是网络安全的基础。在Web服务中,通常采用...
用CXF作为客户端调用webService的demo:本人亲测可用,eclipse工程项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
C++客户端调用C#语言WebService服务案例,资源中含C++客户端代码与C#服务端WebService代码。代码经过测试,可正常运行,同时解决了跨语言WebService调用时字符串乱码无法解析等问题。在该资源中提供了word详细的帮助...
标题与描述均提到了“.NET调用Java XFire发布的WebService封装SOAPHeader头信息”,这是一个涉及跨平台服务调用的问题,具体来说是关于如何在.NET环境中调用由Java使用XFire框架发布的WebService,并正确处理...
例如,如果WebService有一个名为`calculate`的方法,我们可以这样调用: ```java MyWebServiceClient client = new MyWebServiceClient(); int result = client.calculate(5, 3); // 假设calculate接受两个整数并...
在这个场景下,"Xfire客户端调用webservice jar包"是指Xfire客户端为了实现某些功能,如获取服务器数据或更新信息,需要调用Web服务的接口。这些接口通常以Java的jar包形式提供,方便开发者集成到他们的应用中。 ...
调用远程wadl的Webservice代码,请求参数是json,返回结果通过main方法打印
本篇文章将深入探讨如何使用XFire客户端调用Web服务,以及对象传递在Web服务开发中的应用。 首先,理解Web服务的基本概念至关重要。Web服务采用标准的协议如SOAP(Simple Object Access Protocol)进行通信,XML...