Java EE 7: Web Services

SOAPHandler auf Ebene des Servers implementieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
SOAPHandler können auf Ebene des Web Services verwendet werden, um ein- und ausgehende Nachrichten zu analysieren und zu manipulieren. Hier sehen Sie, wie ein SOAPHandler auf Ebene des Servers definiert und dem eigentlichen Webdienst bekannt gemacht wird.

Transkript

SOAPHandler im JAX-WS-Umfeld können genutzt werden, um auf Server- wie auch auf Client-Seite eingesetzt zu werden. In diesem Video befassen wir uns mit dem serverseitigen Einsatz eines SOAPHandlers, und zwar hat der die Aufgabe, eine eingehende Nachricht dahingehend zu überprüfen, ob ein bestimmtes Header-Feld mit einem bestimmten Wert vorhanden ist. Nur wenn dieses Header-Feld vorhanden ist, wird die Kontrolle an die Applikation weitergereicht. Sonst wird eine Fehlermeldung generiert und an den Client zurückgegeben. So lässt sich eine eigene Sicherheitslösung implementieren Man kann dies natürlich auch in ganz anderen Szenarien einsetzen. Wir befinden uns hier auf Ebene eines Web Services. Dieser Web Service wird von einem Client aufgerufen und dieser Client gibt in seinem SOAP-Header ein zusätzliches Element Auth an den Server weiter. Dieses Element verfügt über einen Namensraum, nämlich urn:de.video2brain.services. Und wir erwarten, dass ein bestimmter Wert darin übergeben wird. Ist dies der Fall, soll die entsprechende Methode aufgerufen werden. Ist dies nicht der Fall, soll eine entsprechende Fehlermeldung generiert und an den Client zurückgegeben werden. Um dies zu implementieren, legen wir zunächst eine neue Klasse an. Diese Klasse befindet sich im Package de.video2brain.services.handlers und heißt AuthenticationServerHandler. Es handelt sich um eine ganz normale Java-Klasse, die das Interface SOAPHandler vom Typ SOAPMessageContext implementiert. Dieses Interface erfordert, dass vier Methoden bereitgestellt werden. Nämlich close, handleFault, handleMessage und getHeaders. Die Methode close interessiert uns nicht. Ebensowenig eine weitere Implementierung der Methode handleFault. Einzig die Rückgabe wird hier auf true gesetzt. Wir legen ebenfalls keinen Wert auf eine weiterführende Implementierung der Methode getHeaders. Uns interessiert die Methode handleMessage, deren Rückgabewert wir zunächst einmal auf true setzen. In dieser Methode handleMessage werden wir nun die SOAP-Nachricht referenzieren und werden dann den Header dieser Nachricht durchleuchten, ob das gewünschte Element Auth vorkommt. Dazu werden wir zunächst überprüfen, ob die Nachricht eine eingehende oder ausgehende Nachricht ist. Wir können dies erledigen, indem wir den SOAPMessageContext befragen, ob die Nachricht ausgehend ist. Es gibt die Methode get und die nimmt hier einen Schlüssel entgegen, nämlich MessageContext.MESSAGE_OUTBOUND_PROPERTY. Anhand dieses Schlüssels wird uns ein Boolescher Wert zurückgegeben werden, der entweder wahr ist, wenn die Nachricht zum Client versandt wird, oder er ist falsch, wenn die Nachricht vom Client zum Server kommt. Uns interessiert nur der eingehende Fall. Deswegen überprüfen wir hier, ob isOutbound den Wert false hat Sollte dem so sein, referenzieren wir die eigentliche SOAP-Message. Und zwar über die Methode getMessage der Kontext-Instanz. In der Nachricht selber interessiert uns weder der Body noch was anderes, Wir sind nur am Header interessiert. Also referenzieren wir den SOAPHeader. Und zwar über die Methode getSOAPHeader der Message-Instanz. Dabei kann es zu einer Exception kommen, die wir entsprechend behandeln, indem wir einen Try/catch-Block generieren lassen. Der Header gibt uns die Möglichkeit, auf die untergeordeten Elemente zuzugreifen. Dies geschieht in Form eines Iterators. Wir machen das, indem wir die Methode getChildElements des Headers aufrufen. In dieser Methode werden wir nun eine QName-Instanz übergeben, die den gewünschten Namensraum und den gewünschten Elementnamen beinhaltet. Der Namensraum war de.video2brain.service. Und der Elementname lautet AUTH. Damit haben wir eine Einschränkung vorgenommen. Wir müssen weniger Elemente durchlaufen. Das Durchlaufen der Elemente geschieht in Form einer While-Schleife. Mithilfe der Methode hasNext können wir jederzeit überprüfen, ob es mehr Elemente gibt. Das aktuelle Element ist eine Node-Instanz. Das greifen wir über die Methode Next ab. Nun können wir dieses Element daraufhin überprüfen, was ein textueller Inhalt ist. Das machen wir, indem wir hier die Methode TextContent aufrufen und den dort abgerufenen Text überprüfen. Das, was wir erwarten, war "sicher" mit einem Ausrufezeichen. Sobald das geschehen ist, wenn wir also auf ein Element mit diesem textuellen Inhalt treffen. beenden wir die Verarbeitung, denn wir haben den Header mit dem gewünschten Wert gefunden. Nun müssen wir noch signalisieren, dass möglicherweise die Verarbeitung nicht erfolgreich war. Dies machen wir, indem wir uns den SOAP-Body referenzieren und das geschieht über die Methode getBody des Envelope-Elementes. Das Envelope-Element befindet sich innerhalb der eigentlichen SOAP-Nachricht, die wir weiter oben bereits referenziert haben. SOAPBody (tippt) SOAPBody Wie gesagt, darauf können wir zugreifen über die Methode getSOAPBody der eigentlichen Nachricht. Der Body selber interessiert uns eigentlich gar nicht. Wir wollen ein soapFault-Element generieren. Das machen wir, indem wir die Methode addFault des soapBody aufrufen. Dieses soapFault-Element erlaubt es uns nun, eine Rückgabe zu definieren. Wir machen das mit Hilfe der Methode setFaultString. Das ist eine textuelle Rückgabe, wo wir sagen, dass die Authentifizierung nicht erfolgreich war. Das Ganze wird nun in Form einer Exception an den Client zurückgegeben. Damit ist der ServerHandler fertig implementiert. Nun muss dieser ServerHandler noch registriert und in den eigentlichen Web-Dienst eingebunden werden. Zu diesem Zweck legen wir auf Ebene des Web Services – achten Sie da genau drauf – eine neue XML-Datei an. Diese Datei nennen wir handlers.xml. In dieser Datei befindet sich nun ein handler-chains-Element aus dem Namensraum http://java.sun.com/xml/ns/javaee Lassen Sie sich nicht davon irritieren, dass Eclipse hier einen Fehler anzeigt. Hier ist kein Fehler. Innerhalb des Wurzelelements handler-chains findet sich ein handler-chain-Element. Das beinhaltet ein handler-Element. Dieses handler-Element verfügt über ein untergeordnetes handlerClass-Element und hier werden wir jetzt den kompletten, vollqualifizierten Namen unseres AuthenticationServerHandlers angeben. Der liegt im Package de.video2brain.services.handlers und heißt AuthenticationServerHandler. Diese Datei müssen wir nun noch auf Ebene des Web Services registrieren. Das geschieht, indem wir hier eine HandlerChain-Annotation hinzufügen. Diese verfügbt über ein Attribut file. Das zeigt dann auf die eben definierte handlers.xml-Datei. Wie gesagt, auf Ebene des Web Services werden Sie die HandlerChain registrieren. Innerhalb dieser HandlerChain kann es übrigens mehrere Handler geben. Die würden Sie einfach als untergeordnete Elemente mit hinzufügen. Damit ist der Web Service jetzt auch fertig konfiguriert. Wir werden ihn nun auf dem Server deployen und über den Client einmal aufrufen. Anschließend werden wir dafür sorgen, dass es einen Fehler in der Verarbeitung gibt, so dass wir feststellen können, ob dieser Handler vernünftig funktioniert. Nachdem der Server gestartet ist, kann ich noch ein Publish meiner Applikation machen und sobald dies gesehen ist, bekomme ich die entsprechenden Ausgaben und kann meinen Client starten und diesen Client mit dem Server kommunizieren lassen. Wir sehen jetzt hier, dass die Calls soweit erfolgreich waren. Wir sehen die SOAP-Dokumente, die zum Server gesandt werden. Nun werden wir einmal auf Ebene des Clients beziehungsweise auf Ebene des dort enthaltenen ClientHandlers, auch das ist ja ein SOAPHandler, den Wert des Textknotens manipulieren. Wir entfernen ein Zeichen. Wenn wir jetzt den Aufruf ausführen, sollte es entsprechende Fehlermeldungen geben. Genau so ist das. Wir bekommen hier sofort eine Fehlermeldung angezeigt und wir bekamen vom Server ein soapFault-Element zurückgegeben mit dem textuellen Inhalt: Die Authentifizierung war nicht erfolgreich. Dieselbe Informationen können wir auch auf Serverebene im Logfile finden. Auch hier gibt es die Auskunft, dass die Verarbeitung nicht erfolgreich abgeschlossen werden konnte. Auch hier steht die von uns generierte Fehlermeldung mit drin. Unser serverseitiger Handler funktioniert also einwandfrei. In diesem Video haben wir uns damit auseinandergesetzt, wie wir serverseitig einen SOAPHandler definieren und einbinden können. Wir haben zu diesem Zweck den eigentlichen SOAPHandler geschrieben und diesen dann in der Datei handlers.xml registriert und diese Datei handlers.xml dann mit der HandlerChain-Annotation auf Ebene des Web Services bekannt gemacht.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!