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:
-
JAX-WS: gestionnaire SOAP côté serveur. (Cet article)
-
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
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:
-
com \ mkyong \ ws \ jaxws \ GetServerName.java
-
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 .
Download Source Code
Download It – JAX-WS-Handler-Example.zip (21KB)