JAX-WS: gestionnaire SOAP côté serveur

Le gestionnaire SOAP est un intercepteur de message SOAP, capable d’intercepter le message SOAP entrant ou sortant et de manipuler ses valeurs. Par exemple, attachez un gestionnaire SOAP côté client, qui injectera l’adresse MAC de l’ordinateur du client dans le bloc d’en-tête SOAP pour chaque message SOAP sortant envoyé par le client. Côté serveur, attachez un autre gestionnaire SOAP afin de récupérer l’adresse MAC du client dans le bloc d’en-tête SOAP de chaque message SOAP entrant. De sorte que le côté serveur puisse déterminer quel ordinateur est autorisé à accéder au service publié.

Cet article est divisé en 3 parties:

  1. JAX-WS: gestionnaire SOAP côté serveur. (Cet article)

  2. lien://services web/jax-ws/gestionnaire jax-ws-soap-côté-client/[JAX-WS:

Gestionnaire SOAP côté client]. lien://services Web/jax-ws/jax-ws-soap-handler-testing-for-client-and-server-side/[JAX-WS

: SOAP handler testing for client and server side]

Gestionnaire SOAP côté serveur

Dans cet article, nous vous montrons comment créer un gestionnaire SOAP et l’attacher côté serveur, afin de récupérer l’adresse MAC dans le bloc d’en-tête SOAP de chaque message SOAP entrant. Et effectuez la validation pour n’autoriser que les ordinateurs avec l’adresse MAC « 90-4C-E5-44-B9-8F » à accéder à ce service publié.

Si un client non valide essaie d’accéder au service, renvoyez une SOAPFaultException vers le client.

Structure de répertoire de cet exemple

image

1. Service Web

Un service Web simple, avec une méthode getServerName () pour renvoyer une chaîne.

Fichier: Serveur In.java

package com.mkyong.ws;

import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class ServerInfo{

    @WebMethod
    public String getServerName() {

        return "mkyong server";

    }

}

Générez les fichiers Java nécessaires au déploiement du service Web.

D:\workspace-new\WebServices\bin>wsgen -keep -verbose -cp . com.mkyong.ws.ServerInfo
Note:   ap round: 1
...

com \ mkyong \ ws \ jaxws \ GetServerName.java
com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java
Note: ap tour: 2

Deux fichiers sont générés:

  1. com \ mkyong \ ws \ jaxws \ GetServerName.java

  2. com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java

File: GetServerName.java

package com.mkyong.ws.jaxws;

importer javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; importer javax.xml.bind.annotation.XmlRootElement; importer javax.xml.bind.annotation.XmlType;

@XmlRootElement (name = "getServerName", namespace = "http://ws.mkyong.com/")
@XmlAccessorType (XmlAccessType.FIELD)
@XmlType (name = "getServerName", namespace = "http://ws.mkyong.com/")
Classe publique GetServerName {
}

File: GetServerNameResponse.java

package com.mkyong.ws.jaxws;

importer javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; importer javax.xml.bind.annotation.XmlElement; importer javax.xml.bind.annotation.XmlRootElement; importer 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 **  retourne String ** /public String getReturn () {return this.__return; }

/** **  **  **  @param __return **  la valeur de la propriété __return ** /public void setReturn (String __return) {this.__return = __return; }

}

2. Gestionnaire SOAP

Créez un gestionnaire SOAP pour récupérer la valeur dans le bloc d’en-tête SOAP, pour chaque message SOAP entrant. Voir les commentaires pour l’explication du code.

Fichier MacAddressValidatorHandler.java

package com.mkyong.handler;

importer java.io.IOException; import java.util.Iterator; importer java.util.Set; importer javax.xml.namespace.QName; importer javax.xml.soap.Node; importer javax.xml.soap.SOAPBody; importer javax.xml.soap.SOAPConstants; importer javax.xml.soap.SOAPEnvelope; importer javax.xml.soap.SOAPException; importer javax.xml.soap.SOAPFault; importer javax.xml.soap.SOAPHeader; importer javax.xml.soap.SOAPMessage; importer javax.xml.ws.handler.MessageContext; importer javax.xml.ws.handler.soap.SOAPHandler; importer javax.xml.ws.handler.soap.SOAPMessageContext; importer javax.xml.ws.soap.SOAPFaultException;

La classe publique MacAddressValidatorHandler implémente SOAPHandler <SOAPMessageContext> {

@Override public boolean handleMessage (contexte SOAPMessageContext) {

System.out.println ("Serveur: handleMessage () ......"); Boolean isRequest = (Boolean) context.get (MessageContext.MESSAGE__OUTBOUND__PROPERTY);

//for response message only, true for outbound messages, false for inbound     if(!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;     }

@Override public booléen handleFault (contexte SOAPMessageContext) {System.out.println ("Server: handleFault () ......"); retourne vrai; }

@Override public void close (contexte MessageContext) {System.out.println ("Server: close () ......"); }

@Override public Set <QName> getHeaders () {System.out.println ("Serveur: getHeaders () ......"); return null; } void privé generateSOAPErrMessage (SOAPMessage msg, motif de chaîne) {try {SOAPBody soapBody = msg.getSOAPPart (). getEnvelope (). getBody (); SOAPFault soapFault = soapBody.addFault (); soapFault.setFaultString (raison); lancer une nouvelle SOAPFaultException (soapFault); } catch (SOAPException e) {}}

}

3. Fichier XML du gestionnaire SOAP

Créez un fichier XML de gestionnaire SOAP et insérez votre déclaration de gestionnaire SOAP.

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: classe de handler>
    </javaee: gestionnaire>
  </javaee: handler-chain>
</javaee: handler-chains>

4. Attachez SOAP Handler → Web Service

Pour attacher le gestionnaire SOAP ci-dessus au service Web ServerInfo.java , annoter avec @ HandlerChain et spécifier le nom du fichier du gestionnaire SOAP à l’intérieur.

File: ServerInfo.java

package com.mkyong.ws;

import javax.jws.HandlerChain; importer javax.jws.WebMethod; importer javax.jws.WebService;

@WebService @HandlerChain (file = "handler-chain.xml"), classe publique ServerInfo {

@WebMethod public String getServerName () {return "serveur mkyong"; }

}

5. Editeur de services Web

Un éditeur de service Web simple pour les tests.

package com.mkyong.endpoint; importer javax.xml.ws.Endpoint; importer com.mkyong.ws.ServerInfo;

//Endpoint publisher
public 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 .