首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

soap讯息拦截器SOAPHandler

2013-10-19 
soap消息拦截器SOAPHandler1. Web ServiceA simple web service , with a getServerName() method to retu

soap消息拦截器SOAPHandler
1. Web Service

A simple web service , with a getServerName() method to return a string.

File : ServerInfo.java

?

package com.mkyong.ws; import javax.jws.HandlerChain;import javax.jws.WebMethod;import javax.jws.WebService; @WebServicepublic class ServerInfo{ @WebMethodpublic String getServerName() { return "mkyong server"; } }
?

?

Generate necessary Java files for the web service deployment.

?

D:\workspace-new\WebServices\bin>wsgen -keep -verbose -cp . com.mkyong.ws.ServerInfoNote:   ap round: 1...com\mkyong\ws\jaxws\GetServerName.javacom\mkyong\ws\jaxws\GetServerNameResponse.javaNote:   ap round: 2
?

?

Two files are generated :

    com\mkyong\ws\jaxws\GetServerName.javacom\mkyong\ws\jaxws\GetServerNameResponse.java

File : GetServerName.java

package com.mkyong.ws.jaxws; import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "getServerName", namespace = "http://ws.mkyong.com/")@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "getServerName", namespace = "http://ws.mkyong.com/")public class GetServerName {}

?

File : GetServerNameResponse.java

package com.mkyong.ws.jaxws; import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "getServerNameResponse", namespace = "http://ws.mkyong.com/")@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "getServerNameResponse", namespace = "http://ws.mkyong.com/")public class GetServerNameResponse {     @XmlElement(name = "return", namespace = "")    private String _return;     /**     *      * @return     *     returns String     */    public String getReturn() {        return this._return;    }     /**     *      * @param _return     *     the value for the _return property     */    public void setReturn(String _return) {        this._return = _return;    } }

?

2. SOAP Handler

Create a SOAP handler to retrieve the value in SOAP header block, for every incoming SOAP message. See comments for the code explanation.

File MacAddressValidatorHandler.java

package com.mkyong.handler; import java.io.IOException;import java.util.Iterator;import java.util.Set;import javax.xml.namespace.QName;import javax.xml.soap.Node;import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPConstants;import javax.xml.soap.SOAPEnvelope;import javax.xml.soap.SOAPException;import javax.xml.soap.SOAPFault;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 javax.xml.ws.soap.SOAPFaultException; public class MacAddressValidatorHandler implements SOAPHandler<SOAPMessageContext>{    @Override   public boolean handleMessage(SOAPMessageContext context) { System.out.println("Server : handleMessage()......"); Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); //for response message only, true for outbound messages, false for inboundif(!isRequest){ try{    SOAPMessage soapMsg = context.getMessage();    SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();            SOAPHeader soapHeader = soapEnv.getHeader();             //if no header, add one    if (soapHeader == null){            soapHeader = soapEnv.addHeader();            //throw exception            generateSOAPErrMessage(soapMsg, "No SOAP header.");     }              //Get client mac address from SOAP header     Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT);      //if no header block for next actor found? throw exception     if (it == null || !it.hasNext()){      generateSOAPErrMessage(soapMsg, "No header block for next actor.");             }      //if no mac address found? throw exception     Node macNode = (Node) it.next();     String macValue = (macNode == null) ? null : macNode.getValue();       if (macValue == null){        generateSOAPErrMessage(soapMsg, "No mac address in header block.");      }        //if mac address is not match, throw exception       if(!macValue.equals("90-4C-E5-44-B9-8F")){          generateSOAPErrMessage(soapMsg, "Invalid mac address, access is denied.");       }        //tracking       soapMsg.writeTo(System.out); }catch(SOAPException e){System.err.println(e);}catch(IOException e){System.err.println(e);}     }   //continue other handler chain  return true;} @Overridepublic boolean handleFault(SOAPMessageContext context) { System.out.println("Server : handleFault()......"); return true;} @Overridepublic void close(MessageContext context) {System.out.println("Server : close()......");} @Overridepublic Set<QName> getHeaders() {System.out.println("Server : getHeaders()......");return null;}      private void generateSOAPErrMessage(SOAPMessage msg, String reason) {       try {          SOAPBody soapBody = msg.getSOAPPart().getEnvelope().getBody();          SOAPFault soapFault = soapBody.addFault();          soapFault.setFaultString(reason);          throw new SOAPFaultException(soapFault);        }       catch(SOAPException e) { }    } }

?

3. SOAP Handler XML file

Create a SOAP handler XML file, and puts your SOAP handler declaration.

File : handler-chain.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><javaee:handler-chains      xmlns:javaee="http://java.sun.com/xml/ns/javaee"      xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <javaee:handler-chain>    <javaee:handler>      <javaee:handler-class>com.mkyong.handler.MacAddressValidatorHandler</javaee:handler-class>    </javaee:handler>  </javaee:handler-chain></javaee:handler-chains>

?

4. Attach SOAP Handler –> Web Service

To attach above SOAP handler to web service ServerInfo.java, just annotate with @HandlerChain and specify the SOAP handler file name inside.

File : ServerInfo.java

package com.mkyong.ws; import javax.jws.HandlerChain;import javax.jws.WebMethod;import javax.jws.WebService; @WebService@HandlerChain(file="handler-chain.xml")public class ServerInfo{ @WebMethodpublic String getServerName() { return "mkyong server"; } }

?

5. Web Service Publisher

A simple web service publisher for testing.

package com.mkyong.endpoint; import javax.xml.ws.Endpoint;import com.mkyong.ws.ServerInfo; //Endpoint publisherpublic class WsPublisher{ public static void main(String[] args) {   Endpoint.publish("http://localhost:8888/ws/server", new ServerInfo());    System.out.println("Service is published!");    } }

?

Done, please proceed on next article – Part 2 : JAX-WS – SOAP handler in client side.

?

来源:http://www.mkyong.com/webservices/jax-ws/jax-ws-soap-handler-in-server-side/

热点排行