描述:
最近做一个项目,需要调用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
分享到:
相关推荐
WebService安全性SoapHeader 运行环境 VS2010
webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用...
本方法是用axis1.4技术,实现java客户端调用webservice。已经可实现过可行的,如果不行可加我QQ号302633进行详细解析。
客户端调用webservice的方式其一 soap请求,此例子演示的是根据订单号获取订单的物流信息
springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口
Java 调用webservice cxf客户端调用demo和服务端,包含jar包,服务端发布后直接用客户端调用
java axis客户端调用webservice,可应用于ofbiz框架。 解决网络上共享代码两次调用后会出现timeout的BUG
这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...
关于此代码的使用及相关配置,可以见此文:...代码开发时环境:Windows8.1、Visual Studio 2013、IIS8 注意:测试代码时,重新部署WebService服务且修改客户端测试程序的服务引用
axis2客户端调用webService接口需要用的jar包,在一次调接口中遇到的问题,亲测可用(整理成了比较精简的jar包)
springboot整合CXF发布webservice和客户端调用 项目中每个类都有详细的注释,保证都能看懂,不失为一个学习springboot整合cxf来学习webservice发布调用的好例子
客户端调用webservice所需完整jar包,可用,客户端调用webservice所需完整jar包,可用
调用远程wadl的Webservice代码,请求参数是json,返回结果通过main方法打印
在服务端 对外开放接口服务,然后在客户端 调用服务端的方法, 实现客户端(一个javaweb项目)对服务端(javaweb项目)方法的调用, 实际上就是发送和接收消息,实现两个系统间消息的传递 jar包都在lib项目里 具体...
Xfire客户端调用webservice接口所需 jar包,亲测可用。
WebService客户端调用WebService服务示例代码,java代码,纯手工,包括直接httpClient直接发送Saop报文调用和利用wsimport -keep 生成客户端代码后调用两种方式的示例。因涉及商务账户密码隐私,因此代码中的有些账号...
webservice ixfir 客户端端开发 对象传递使webservice开发更加简单快捷
.net调用java xfire发布的webservice封装soapheader头信息
用CXF作为客户端调用webService的demo:本人亲测可用,eclipse工程项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。
c#调用java带身份验证webservice