`
mark_5528
  • 浏览: 63543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

客户端调用有安全认证的Webservice,可用messageHander 修改 SoapHeader

 
阅读更多

描述:
最近做一个项目,需要调用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

    接下来,在服务接口上使用`[SoapHeader]`特性声明SoapHeader参数,这样客户端在调用服务时就需要提供这个Header。在服务实现中,我们可以通过检查Header来验证用户身份。 ```csharp [WebService(Namespace = ...

    webService在客户端调用

    webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用webService在客户端调用...

    java客户端调用webservice所调用的axis1.4包和方法调用

    本方法是用axis1.4技术,实现java客户端调用webservice。已经可实现过可行的,如果不行可加我QQ号302633进行详细解析。

    客户端调用webservice方式一(soap请求)

    本教程将详细讲解客户端如何通过SOAP(Simple Object Access Protocol)请求调用WebService,以实现根据订单号获取订单的物流信息。 **SOAP请求详解** SOAP是一种XML(eXtensible Markup Language)格式的消息协议...

    springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

    本教程将讲解如何使用Spring Boot集成Apache CXF(一个强大的Java Web Service框架)来构建服务端,并探讨两种Java客户端调用Web Service接口的方法。 首先,我们需要理解Spring Boot与CXF的整合。Spring Boot通过...

    C#静态调用带有SoapHeader验证的WebService

    关于此代码的使用及相关配置,可以见此文:...代码开发时环境:Windows8.1、Visual Studio 2013、IIS8 注意:测试代码时,重新部署WebService服务且修改客户端测试程序的服务引用

    Java webservice cxf客户端调用demo和服务端

    Java WebService CXF客户端调用和服务端的实现是企业级应用程序中常见的通信方式,它基于标准的SOAP(Simple Object Access Protocol)协议,提供了一种在分布式环境中交换信息的方法。CXF是一个开源框架,它简化了...

    WebService客户端调用WebService服务示例代码——java

    WebService客户端调用WebService服务示例代码,java代码,纯手工,包括直接httpClient直接发送Saop报文调用和利用wsimport -keep 生成客户端代码后调用两种方式的示例。因涉及商务账户密码隐私,因此代码中的有些账号...

    axis客户端调用webservice

    java axis客户端调用webservice,可应用于ofbiz框架。 解决网络上共享代码两次调用后会出现timeout的BUG

    AXIS2作为客户端调用webService的demo

    用AXIS2作为客户端调用webService的demo:本人亲测可用,eclipse工程java项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。

    webService客户端调用服务端传对象参数

    这个工程详细的介绍了webService服务客户端如何调用简单和复杂的webService,其中就包括传递的参数是对象类型,返回数据是数组类型,还有最简单的基本类型。压缩包里还配置说明,清晰的说明webService的整个过程,对...

    axis2客户端调用webService接口,精简jar包

    本文将深入探讨如何使用Axis2客户端调用WebService接口,并且会特别关注如何精简所需的jar包。 首先,了解Axis2客户端的基本概念是至关重要的。Axis2客户端是用于与远程Web服务交互的工具,它允许开发者通过SOAP...

    axis2客户端调用服务端,带用户身份认证

    当涉及到“axis2客户端调用服务端,带用户身份认证”时,我们主要关注的是如何在 Axis2 客户端中添加安全机制,确保只有经过验证的用户能够访问服务。 首先,理解身份认证是网络安全的基础。在Web服务中,通常采用...

    CXF作为客户端调用webService的demo

    用CXF作为客户端调用webService的demo:本人亲测可用,eclipse工程项目包含完整代码和完整jar包, 只要用eclipse导入项目即可,运行控制台显示success或者false字符串,说明OK。

    C++客户端调用C#语言WebService服务案例,资源中含C++客户端代码与C#服务端WebService代码,代码经过测试

    C++客户端调用C#语言WebService服务案例,资源中含C++客户端代码与C#服务端WebService代码。代码经过测试,可正常运行,同时解决了跨语言WebService调用时字符串乱码无法解析等问题。在该资源中提供了word详细的帮助...

    .net调用java xfire发布的webservice封装soapheader头信息

    标题与描述均提到了“.NET调用Java XFire发布的WebService封装SOAPHeader头信息”,这是一个涉及跨平台服务调用的问题,具体来说是关于如何在.NET环境中调用由Java使用XFire框架发布的WebService,并正确处理...

    客户端编程方式调用webservice

    例如,如果WebService有一个名为`calculate`的方法,我们可以这样调用: ```java MyWebServiceClient client = new MyWebServiceClient(); int result = client.calculate(5, 3); // 假设calculate接受两个整数并...

    Xfire客户端调用webservice jar包

    在这个场景下,"Xfire客户端调用webservice jar包"是指Xfire客户端为了实现某些功能,如获取服务器数据或更新信息,需要调用Web服务的接口。这些接口通常以Java的jar包形式提供,方便开发者集成到他们的应用中。 ...

    客户端调用远程Webservice

    调用远程wadl的Webservice代码,请求参数是json,返回结果通过main方法打印

    webservice xfire 客户端调用实现

    本篇文章将深入探讨如何使用XFire客户端调用Web服务,以及对象传递在Web服务开发中的应用。 首先,理解Web服务的基本概念至关重要。Web服务采用标准的协议如SOAP(Simple Object Access Protocol)进行通信,XML...

Global site tag (gtag.js) - Google Analytics