使用java提供的handler机制在客户端对SOAP请求包注入header,在服务端对SOAP请求包进行解析,获得头部,并展示出头部的信息
时间: 2023-12-19 10:04:33 浏览: 32
在客户端使用Java提供的Handler机制可以通过实现SOAPHandler接口来完成。具体步骤如下:
1. 定义一个类实现SOAPHandler接口,重写以下方法:
```java
public class MyHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
// 在此处可以对请求或响应消息进行处理
return true; // 返回true表示继续处理SOAP消息
}
@Override
public boolean handleFault(SOAPMessageContext context) {
// 在此处可以对SOAP消息处理发生异常时进行处理
return true; // 返回true表示已经处理过了异常
}
@Override
public void close(MessageContext context) {
// 在此处可以释放资源
}
@Override
public Set<QName> getHeaders() {
// 在此处可以返回处理的SOAP头部信息
return null;
}
}
```
2. 注册MyHandler类到SOAP客户端中:
```java
// 创建一个JAX-WS的服务端代理对象
HelloWorldService service = new HelloWorldService();
HelloWorldPortType port = service.getHelloWorldPort();
// 获取SOAP客户端的BindingProvider对象
BindingProvider bp = (BindingProvider) port;
// 获取SOAP客户端的Binding对象
Binding binding = bp.getBinding();
// 创建一个SOAPHandler链
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(new MyHandler());
// 将SOAPHandler链注册到Binding对象中
binding.setHandlerChain(handlerChain);
```
3. 在MyHandler类的handleMessage方法中获取SOAP头部信息,并注入到SOAP消息中:
```java
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outbound) {
// 在SOAP请求消息的头部添加一个自定义的SOAP头信息
try {
SOAPMessage message = context.getMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();
if (header == null) {
header = envelope.addHeader();
}
// 创建一个SOAP头部元素
QName qname = new QName("http://www.example.com/myheader", "MyHeader");
SOAPHeaderElement headerElement = header.addHeaderElement(qname);
// 添加一个SOAP头部元素属性
QName attrQname = new QName("http://www.example.com/myheader", "id");
headerElement.addAttribute(attrQname, "123");
// 添加一个SOAP头部元素子节点
SOAPElement childElement = headerElement.addChildElement("Name");
childElement.addTextNode("John");
} catch (SOAPException e) {
e.printStackTrace();
}
}
return true;
}
```
在服务端,可以通过类似的方式来获取SOAP请求消息的头部信息:
```java
@WebService
public class HelloWorldImpl implements HelloWorld {
@Resource
WebServiceContext context;
@Override
public String sayHello(String name) {
// 获取SOAP请求消息的头部信息
MessageContext msgContext = context.getMessageContext();
SOAPMessageContext soapMsgContext = (SOAPMessageContext)msgContext;
SOAPMessage soapMsg = soapMsgContext.getMessage();
SOAPHeader soapHeader = soapMsg.getSOAPHeader();
if (soapHeader != null) {
// 获取SOAP头部元素
QName qname = new QName("http://www.example.com/myheader", "MyHeader");
SOAPHeaderElement headerElement = (SOAPHeaderElement)soapHeader.getChildElements(qname).next();
// 获取SOAP头部元素属性
String id = headerElement.getAttributeValue(new QName("http://www.example.com/myheader", "id"));
// 获取SOAP头部元素子节点的文本
String name = headerElement.getElementsByTagName("Name").item(0).getTextContent();
}
return "Hello " + name + "!";
}
}
```
以上就是使用Java提供的Handler机制在客户端对SOAP请求包注入header,在服务端对SOAP请求包进行解析,获得头部,并展示出头部的信息的实现方法。