我们已经知道在handler中可以对发送的消息进行拦截和处理。现在我们在client端的handler中添加header信息。同时在server端接收。
client端的HeaderHandler.java:
package service.ps.smile.com.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
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;
public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
private String ns = "http://com.smile.ps.service/";
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(out){
SOAPMessage message = context.getMessage();
//判断message是否有header
SOAPEnvelope envelop = message.getSOAPPart().getEnvelope();
SOAPHeader header = envelop.getHeader();
if(header == null){
header = envelop.addHeader();
}
QName qname = new QName(ns,"licenseInfo","ws");
header.addHeaderElement(qname).setValue("Hello World!");
}
} catch (SOAPException e) {
e.printStackTrace();
}
System.out.println("headerHandler");
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("error");
return false;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
在服务器端添加一个LicenseHandler.java:
package com.smile.service.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
boolean out = (Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(!out){
SOAPMessage message = context.getMessage();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();
if(header == null){
header = envelope.addHeader();
}
NodeList nl = header.getElementsByTagName("ws:licenseInfo");
Node n = nl.item(0);
System.out.println("server:"+n.getTextContent());
}
} catch (SOAPException e) {
e.printStackTrace();
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return false;
}
@Override
public void close(MessageContext context) {
}
@Override
public Set<QName> getHeaders() {
return null;
}
}
同时对handler进行配置。
然后我们在调用的时候:
package service.ps.smile.com;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8890/ns?wsdl");
QName qname = new QName("http://com.smile.ps.service/","MyServiceImplService");
MyServiceImplService myimpService = new MyServiceImplService(url,qname);
IMyService ms = myimpService.getMyServiceImplPort();
ms.login("123", "123");
System.out.println("end");
} catch (UserException_Exception e) {
System.out.println(e.getMessage());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
就可以发送和接收header的消息了。