我们已经知道怎么传递header信息。这里我们看怎么进行校验。
对Test进行修改:
package service.ps.smile.com;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Holder;
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();
User u = new User();
u.setId(10);u.setNickname("old big");u.setUsername("laoda");u.setPassword("123456");
// ms.login("123", "123");
Holder<User> users = new Holder<User>(u);
ms.addUser(users);
System.out.println("end");
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
客户端HeaderHandler进行修改,只对list和addUser操作进行处理:
package service.ps.smile.com.handler;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
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;
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();
}
SOAPBody body = envelop.getBody();
Node nName = body.getChildNodes().item(0);
String partName = nName.getLocalName();
if("list".equals(partName) || "addUser".equals(partName)){
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.Iterator;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
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 javax.xml.ws.soap.SOAPFaultException;
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();
SOAPBody body = envelope.getBody();
Node nName = body.getChildNodes().item(0);
String partName = nName.getLocalName();
if("list".equals(partName) || "addUser".equals(partName)){
Iterator<SOAPHeaderElement> iterator = header.extractAllHeaderElements();
if(!iterator.hasNext()){
//添加一个错误信息
System.out.println("ttt");
SOAPFault fault = body.addFault();
fault.setFaultString("头部信息不正确!");
throw new SOAPFaultException(fault);
}
while(iterator.hasNext()){
SOAPHeaderElement ele = iterator.next();
System.out.println(ele.getTextContent());
}
// 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;
}
}
这样就实现了对header信息进行校验的过程。