举例:
这个例子我们采用的服务为WEBLOGIC8.X,这里我们通过后台组件提供查询服务的验证处理程序来详细说明。这里面的验证内容主要是帐号和个人识别码,它们被放在SOAP请求消息的头部分中,消息处理程序将重新获得帐号和个人识别码并验证,如果验证通过,一旦通过验证,后台组件将会调用余额查询来获得此帐号的余额。
以下就是写一个处理程序的步骤:
1)处理程序必须实现javax.xml.rpc.handler.Handler 接口或继承Weblogic中的GenericHandler 类。
2)javax.xml.rpc.handler.Handler 接口包含了以下这些方法用来实现
init ()
destroy()
getHeaders()
handleRequest()
handleResponse()
handleFault()
如果使用weblogic.webservice.GenericHandler 类,只需要重写必须的方法,在这个例子中验证处理程序重写了handleRequest() 和handleResponse() 方法。如果handleRequest()方法返回true,将会调用处理链中的下一个处理程序,如果这个处理程序是处理链中最后一个元素,将会调用后台的WEB服务程序。如果 handleRequest()方法返回false,对应的handleResponse()方法将会被调用。验证处理程序中handleRequest () 将从SOAP的头部分中重新获得帐号和个人识别码,并且验证后要返回true 或false结果。
AuthenticationHandler.java
import java.util.Map;
import java.util.Iterator;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import weblogic.webservice.GenericHandler;
public class AuthenticationHandler extends GenericHandler
{
private int me = System.identityHashCode(this);
private HandlerInfo handlerInfo = null;
String accountNo = null;
String pin = null;
public void init(HandlerInfo handlerInfo)
{
this.handlerInfo = handlerInfo;
}
public boolean handleRequest(MessageContext messageContext)
{
System.err.println("** handleRequest called in: "+me);
try
{
SOAPMessageContext sctx = (SOAPMessageContext)messageContext;
SOAPMessage message = sctx.getMessage();
SOAPPart sp = message.getSOAPPart();
SOAPEnvelope senv = sp.getEnvelope();
SOAPHeader sh = senv.getHeader();
Iterator iter = sh.getChildElements();
if(iter.hasNext())
{
iter.next(); //skip text
Object obj = iter.next(); //account details
SOAPElement elt = (SOAPElement)obj;
iter = elt.getChildElements();
iter.next(); //skip text node
obj = iter.next();
elt = (SOAPElement)obj;
accountNo = elt.getValue();
iter.next(); //skip text node
obj = iter.next();
elt = (SOAPElement)obj;
pin = elt.getValue();
}
}
catch (Exception e)
{
e.printStackTrace();
throw new JAXRPCException(e);
}
if(accountNo.equals("12345") && pin.equals("6789"))
return true;
else
return false;
}
public boolean handleResponse(MessageContext messageContext)
{
System.out.println("Inside HandleResponse");
return true;
}
public QName[] getHeaders()
{
return handlerInfo.getHeaders();
}
}
