java saop vector用法_java使用Message Handler修改WebService客户端的SOAP头

2015-02-19 06:30:01

阅读( 916 )

在调用webService时,有时候需要在SOAP头中插入信息,比如鉴权信息。

下面的例子演示如何设置给WebService设置授权信息。

首先我们需要实现SOAPHandler接口的类,这个类决定了要调用那些Handler,以什么顺序调用。

最后我们需要给WebService的客户端添加HandlerResolver类实例.

默认情况下SOAP头是空的:

TestUser

TestPassword

如下是SOAPHandler的实现,这里有好多方法可以实现,但在这里我们仅需要实现handleMessage()方法。

package cn.outofmemory.ws.example;

import java.util.Set;

import javax.xml.namespace.QName;

import javax.xml.soap.SOAPElement;

import javax.xml.soap.SOAPEnvelope;

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 outofmemory.cn

*/

public class HeaderHandler implements SOAPHandler {

public boolean handleMessage(SOAPMessageContext smc) {

Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

if (outboundProperty.booleanValue()) {

SOAPMessage message = smc.getMessage();

try {

SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();

SOAPHeader header = envelope.addHeader();

SOAPElement security =

header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

SOAPElement usernameToken =

security.addChildElement("UsernameToken", "wsse");

usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");

SOAPElement username =

usernameToken.addChildElement("Username", "wsse");

username.addTextNode("TestUser");

SOAPElement password =

usernameToken.addChildElement("Password", "wsse");

password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");

password.addTextNode("TestPassword");

//Print out the outbound SOAP message to System.out

message.writeTo(System.out);

System.out.println("");

} catch (Exception e) {

e.printStackTrace();

}

} else {

try {

//This handler does nothing with the response from the Web Service so

//we just print out the SOAP message.

SOAPMessage message = smc.getMessage();

message.writeTo(System.out);

System.out.println("");

} catch (Exception ex) {

ex.printStackTrace();

}

}

return outboundProperty;

}

public Set getHeaders() {

//throw new UnsupportedOperationException("Not supported yet.");

return null;

}

public boolean handleFault(SOAPMessageContext context) {

//throw new UnsupportedOperationException("Not supported yet.");

return true;

}

public void close(MessageContext context) {

//throw new UnsupportedOperationException("Not supported yet.");

}

}

如下是HandlerResolver的实现类定义:

package cn.outofmemory.ws.example;

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;

/**

*

* @author outofmemory.cn

*/

public class HeaderHandlerResolver implements HandlerResolver {

public List getHandlerChain(PortInfo portInfo) {

List handlerChain = new ArrayList();

HeaderHandler hh = new HeaderHandler();

handlerChain.add(hh);

return handlerChain;

}

}

下面是调用webService的代码:

JavadbWebServiceService service = new JavadbWebServiceService();

HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();

service.setHandlerResolver(handlerResolver);

JavadbWebService port = service.getJavadbWebServicePort();

//调用web service

String currentTime = port.getTime();

System.out.println("Current time is: " + currentTime);

分享给朋友:

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息:

面试题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值