Client/Server-Programmierung WS 2007/2008 Web Services: Schritt
Transcrição
Client/Server-Programmierung WS 2007/2008 Web Services: Schritt
Client/Server-Programmierung WS 2007/2008 Web Services: Schritt-für-Schritt Anleitung (Sitzungsverwaltung mit Hilfe von HTTP Cookies) Version 1.1, 26.09.07 Eingesetzte Software: - Apache Tomcat 5.5.9 - Axis 1.2.1 Hinweis: Bevor mit Axis/Tomcat im Labor H-A 4111 das erste Mal gearbeitet werden kann, ist das Installationsskript /opt/dist/tools/tomcat_install.sh auszuführen und die entsprechenden Umgebungsvariablen zu setzen, siehe Abschnitte 4.4.1 und 10.3.1 des Vorlesungsskripts. Web Services I. Erstellung eines Web Services (die Börsenanwendung als Web Service) Die Erstellung eines Web Services (die Serverseite) mit Axis unter Verwendung von Axis-Tools benötigt mehrere Schritte. Nehmen wir an Sie haben die vorherigen Implementierungen im ToyDax Verzeichnis realisiert. Als Demonstrationsbeispiel wird der Web Service ToyDaxServCache entwickelt, der Clients die Möglichkeit bietet, die elf bekannten Methoden aufzurufen. Schritt 1: Erstellung eines Java-Interface Am Anfang müssen Sie die vom Web Service zur Verfügung gestellten Methoden in einem JavaInterface definieren. Z.B. können Sie das verwendete RMI-Interface anpassen. Die Abbildung zeigt die Position des Java-Interfaces (Dax.java) innerhalb des Dateisystem: ToyDax/ |---wscookie/ |--- Dax.java Abbildung 1. Java-Interface Datei innerhalb des Dateisystems Hinweis: Verwenden Sie die package Java-Direktive. Übersetzen Sie die Interface-Datei mit: javac Dax.java Schritt 2: Erzeugung einer WSDL-Datei Das zuvor entwickelte Java-Interface Dax.java wird dem Axis-Tool Java2WSDL übergeben. Daraus wird ein WSDL-Dokument generiert und alle Methoden des Interface ToyDax.wscookie.Dax aufgenommen werden. Die Erzeugung erfolgt durch den folgenden Komandoaufruf: java org.apache.axis.wsdl.Java2WSDL \ -o ToyDax/wscookie/Dax.wsdl \ -l "http://localhost:8080/axis/services/ToyDaxServCookie" \ -n "services:Dax" \ ToyDax.wscookie.Dax Der Aufruf bewirkt, dass die WSDL-Datei Dax.wsdl erzeugt wird (Voraussetzung: Sie arbeiten mit dem Paket ToyDax.wscookie und Tomcat verwendet Portnummer 8080) . Die hierbei verwendeten Optionen werden in Tabelle 1 erläutert. Für andere Optionen siehe Vorlesung und Referenzlisten. Option -o -l -n Beschreibung/Auswirkung Gibt den Dateinamen (hier Dax.wsdl) des zu erstellenden WSDL-Dokumentes an. Gibt den URL des Web Service an, der in der WSDL-Datei beschrieben wird. Dieser URL wird später von der Clientseite verwendet (hier wird der Web Service unter dem Namen ToyDaxServCookie bekannt sein). Beschreibt den Namespace des Services. In der WSDL-Datei findet sich dann der Parameterwert des Namespaces in der folgenden Zeile wieder: <wsdl:definitions targetNamespace="services:Dax" xmlns:impl="services:Dax" xmlns:intf="services:Dax" -s ...> Gibt den Namen des Service an. Falls diese Option nicht verwendet wird, wird implizit der Name, des mit -l spezifizierten URL, genommen. Tabelle 1. Befehlsoptionen von Java2WSDL Schritt 3: Übersetzung der WSDL-Datei in Java-Klassen Die zuvor erzeugte WSDL-Datei wird durch den Einsatz eines weiteren WSDL-Tool von Axis, namens WSDL2Java, übersetzt. Dieser Schritt erzeugt Java-Code für die Client- und Serverseite. Dieses Vorgehen wird auch bei Middleware wie z.B. CORBA (Übersetzung der CORBA-IDL) verwendet. Die Erzeugung erfolgt durch den folgenden Komandoaufruf: java org.apache.axis.wsdl.WSDL2Java \ -d Session -s -S true \ -p ToyDax.wscookie.Dax_PKGwsdl ToyDax/wscookie/Dax.wsdl Wie Sie merken, wurde für den Deployment Descriptor der Typ “Session“ gewählt, weil hier das Session-Management von Axis verwendet werden soll. Axis bietet mehrere Möglichkeiten, Sessions zu erzeugen. Der einfachste (und klar nicht der beste) Weg ist Cookies zu verwenden. Axis bietet dem Entwickler an, durch das Setzen von Cookies seine Sessions zu verwalten. Deshalb soll die Clientseite diese Vorgehensweise auch technisch unterstützen (siehe Erstellung eines Clients). Die Java-Quellcodes werden in dem Zielverzeichnis ToyDax/wscookie/Dax_PKGwsdl erzeugt. Wofür die einzelnen von WSDL2Java generierten Klassen zuständig sind ist in Kapitel 10.3.3 der Vorlesungsfolien beschrieben. Die erzeugten Java-Quelldateien sind hier mit einer kurzen Beschreibung aufgelistet: • Dax.java (Java-Interface des Dienstes) • DaxServiceLocator.java (Lokalisierung des Dienstes) • DaxService.java (Hilfsklasse für Lokalisierung) • ToyDaxServCookieSoapBindingImpl.java (Gerüst für die Dienst-Implementierung) • ToyDaxServCookieSoapBindingSkeleton.java (Server-Skeleton – nicht unbedingt nötig, wenn die Option -S true nicht verwendet wird!) • ToyDaxServCookieSoapBindingStub.java (Client-Stub) Zusätzlich werden die Deployment-Deskriptoren • deploy.wsdd (Deployment-Descriptor für AdminClient) • undeploy.wsdd (Deployment-Descriptor für AdminClient) generiert. Die hierbei verwendeten Optionen von WSDL2Java finden Sie in Tabelle 2: Option Beschreibung/Auswirkung Erwartet als arg den Deployment-Zusatz Session, Application oder Request. Wird -d arg Session gewählt, wird für jeden neu anfragenden Client eine Session erstellt. Erzeugt die Java-Klassen, die auf der Serverseite ausgeführt werden sollen: - eine Skeleton-Klasse namens ToyDaxServCookieSoapBindingSkeleton.java -s - eine Implementierungsklasse ToyDaxServCookieSoapBindingImpl.java Zusätzlich werden die Deployment-Descriptoren deploy.wsdd und undeploy.wsdd erzeugt. Damit können Sie später den Service “aktivieren“ und “deaktivieren“. Wenn diese Option angegeben ist, wird die Skeleton-Klasse deployt, ansonsten wird die -S Implementierungsklasse deployt. Dies bewirkt, dass der übergebene Parameter als Paketname für die Java-Quelldateien -p verwendet wird. Tabelle 2. Befehloptionen von WSDL2Java Schritt 4: Einfügen der Programmlogik Wie in Abbildung 2 dargestellt, wurde durch den Einsatz von WSDL2Java u.a. auch die Implementierungsklasse ToyDaxServCookieSoapBindingImpl erzeugt. ToyDax/ |---wscookie/ |--- Dax.java |--- Dax.wsdl |--- Dax_PKGwsdl/ |--- Dax.java |--- DaxServiceLocator.java |--- DaxService.java |--- ToyDaxServCookieSoapBindingImpl.java |--- ToyDaxServCookieSoapBindingSkeleton.java |--- ToyDaxServCookieSoapBindingStub.java Abbildung 2. Die Anwendung von WSDL2Java auf das erzeugte WSDL-Dokument Diese Klasse ist nur ein Gerüst, die Methoden haben nur einen Rumpf, weil Axis noch keine Programmlogik eingefügt hat. Hier müssen Sie zwei wichtige Ergänzungen durchführen. Erstens müssen Sie alle Methoden implementieren und zweitens den Konstruktor ergänzen. Nehmen wir als Beispiel zwei Methoden. Für die Methoden AGs() und Buy() wurde der folgende Code erzeugt: public class ToyDaxServCookieSoapBindingImpl implements ToyDax.wscookie.Dax_PKGwsdl.Dax { ... public java.lang.String[] AGs() throws java.rmi.RemoteException { return null; } ... public boolean Buy(java.lang.String in0, int in1) throws java.rmi.RemoteException { return false; } } Tipp: Es ist durchaus möglich, dass Axis den ursprünglichen Methodennamen, so wie die in die Interface-Datei vorkommen, verändert hat. Wenn dieses Phänomen passiert, müssen Sie auf der Clientseite die Aufrufe anpassen. Die Klasse muss nun für die eigenen Zwecke umprogrammiert werden. Die einfachste Variante ist wrapper-Klassen bzw. -Methoden zu verwenden (genau wie bei der RMI Implementierung). In der Methode AGs() müssen Sie z.B. die wrapper-Methode der statischen Klasse (oder des ersten Objektes, wenn Sie eine Instanz der Klasse erzeugt haben), im Beispiel DaxServer genannt (siehe Übungsblatt 1), aufrufen: public java.lang.String[] AGs() throws java.rmi.RemoteException { return DaxServer._AGs(); } Für die Buy() Methode müssen Sie die wrapper-Methode des zweiten Objekts aufrufen: public boolean Buy(java.lang.String AG, int Menge) throws java.rmi.RemoteException { return (depot.Buy(AG, Menge)); } Der Konstruktor sollte eine Instanz des Depot-Objekts (oben depot genannt) erzeugen: public ToyDaxServCacheSoapBindingImpl() { depot = new Depot(); ... } Durch Hinzufügen von Programmlogik und die nötigen import-Anweisungen entsteht die Applikationsklasse, die im letzten Schritt deployt werden kann. Schritt 5: Kopieren der nötigen class-Dateien in das Axis-Verzeichnis Falls Tomcat gestartet ist, müssen Sie ihn stoppen. Nachdem Sie die Java Dateien mit dem Befehl: javac ToyDax/wscookie/Dax_PKGwsdl/*.java übersetzt haben, müssen Sie die class-Dateien in das Axis-Verzeichnis $CATALINA_BASE/ webapps/axis/WEB-INF/classes kopieren: cp --parents -uv ToyDax/wscookie/Dax_PKGwsdl/*.class \ $CATALINA_BASE/webapps/axis/WEB-INF/classes Sie können jetzt den Tomcat neu starten (cd /tmp; $CATALINA_HOME/bin/catalina.sh run). Schritt 6: Das Deployment des Web Service In Schritt 3 wurde von WSDL2Java u.a. auch der Deployment Deskriptor deploy.wsdd für den Web Service erstellt. Um zu erklären, was beim Depoyment passiert, sollten Sie den Deployment Deskriptor näher unter die Lupe nehmen. Wie dem Inhalt dieser Datei zu entnehmen ist, wurde die Skeleton Klasse als Aufrufer des Dienstes ausgewählt. In dem Code der Skeleton-Klasse wird dem anfragenden Client ein neues Objekt der Implementationsklasse zur Verfügung gestellt. Bezogen auf diese Aufgabe lässt sich in der Klasse ToyDaxServCookieSoapBindingSkeleton der folgende Code finden, aus dem hervorgeht, weshalb im Deployment Deskriptor die Skeleton-Klasse statt der ImplementierungsKlasse angegeben wird: public ToyDaxServCookieSoapBindingSkeleton() { impl = new ToyDax.wscookie.Dax_PKGwsdl.ToyDaxServCookieSoapBindingImpl(); } Das Deployment erfolgt durch den folgenden Aufruf: java org.apache.axis.client.AdminClient –p <port> \ ToyDax/wscookie/Dax_PKGwsdl/deploy.wsdd Jetzt ist der Web Service unter Axis registriert. Die Option –p <port> ist immer dann erforderlich, wenn Tomcat einen anderen Port als 8080 nutzt. Im Labor H-A 4111 müssen Sie für <port> die Ihnen zugewiesene Port-Nummer angeben, die Tomcat auch beim Start ausgibt. Hinweise: a) Testen Sie, ob der Web Service wirklich erfolgreich deployt ist: Starten Sie einen Browser mit der URL http://localhost:8080/axis (natürlich müssen Sie ggf. auch hier die 8080 durch die Port-Nummer Ihres Tomcat ersetzen!) und klicken Sie auf den Link List auf der linken Seite. Sie müssen den neuen Dienst jetzt sehen. Der Service ist nun in Betrieb. b) Da Axis auch HTTP-GET Requests unterstützt, können Sie ihren Web Service mit einem Browser direkt ausprobieren: http://localhost:8080/axis/services/ToyDaxServCookie?method=AGs sollte das gewünschte Ergebnis liefern. c) Wenn Sie die Klassen des Web Service neu kompilieren (und auf den Server laden) sollten Sie den Tomcat neu starten. Alternativ können Sie über den Tomcat Web Application Manager (unter der URL http://localhost:8080/manager/html) auch nur Axis neu laden (Reload-Kommando unter der Rubrik Applications). Oder Sie können mit dem Axis Admin-Tool den Service redeployen (undeploy, deploy). Das Undeployment erfolgt dabei durch den folgenden Aufruf: java org.apache.axis.client.AdminClient –p <port> \ ToyDax/wscookie/Dax_PKGwsdl/undeploy.wsdd d) Wie Sie bemerkt haben, ist es eine müsahme Arbeit, alle diese Schritte auszuführen. Hier könnte man eine Skript-Datei einsetzen. Dafür sind eigentlich die Skript-Dateien gedacht. Schreiben Sie ein Skript für das Erzeugung des Web Services mit Optionen für Deployment und Undeployment. II. Erstellung eines Clients Die Erstellung eines Clients setzt nicht zwangsweise voraus, dass der Web Service, mit dem kommuniziert werden soll, mit Java programmiert ist. Es ist schlichtweg egal, welche Entwicklungstechnologie auf der Serverseite zum Einsatz kam. Wichtig ist nur, dass die Serverseite ein WSDLDokument zur Verfügung stellt. Schritt 1: Übersetzung der WSDL-Datei in Java-Klassen Beschaffen Sie das WSDL-Dokument (z.B. über die URL http://localhost:8080/axis/ services/ToyDaxServCookie?wsdl) und übergeben Sie es dem Axis-Tool WSDL2Java auf dem Clientrechner zur Übersetzung. Genauso wie beim Server, generiert WSDL2Java dann die JavaQuelldateien für die Clientseite. java org.apache.axis.wsdl.WSDL2Java -d Session \ -p ToyDax.wscookie.Dax_PKGwsdl Dax.wsdl Die Beschreibung der verwendeten Optionen finden Sie in Tabelle 2. Die Client-Applikation benötigt die folgenden Dateien: • • • • Dax.java (Java-Interface des Dienstes) DaxService.java (Hilfsklasse für Lokalisierung) DaxServiceLocator.java (Lokalisierung des Dienstes) ToyDaxServCookieSoapBindingStub.java (Client-Stub) Schritt 2: Client-Code erstellen und übersetzen Der Client-Code baut die Verbindung zum Web Service über den Service-Locator auf. Auf der Serverseite wurde bei der Erzeugung des WSDL-Dokuments (Schritt 2 auf Serverseite) die URL spezifiziert, unter der der erstellte Web Service erreichbar ist. Genau diese URL wurde von WSDL2Java in die Service-Locator Klasse hineincodiert. Die serviceLocator Instanz dient dazu, eine Referenz auf den Service zu erzeugen: // Verbindung zum Web Service aufbauen DaxServiceLocator serviceLocator = new DaxServiceLocator(); Der Service-Locator liefert nun eine Referenz auf den Service, die noch auf die Stub-Klasse gecastet werden muß: ToyDaxServCookieSoapBindingStub daxServer = (ToyDaxServCookieSoapBindingStub)ServiceLocator.getToyDaxServCookie(); Durch den Aufruf der Methode setMaintainSession() in der Stub-Klasse wird Axis mitgeteilt, dass der Client im Begriff ist, eine Session zu erzeugen und die nachfolgende Kommunikation über dieses Session-Objekt ablaufen soll: // Axis informieren, dass eine Session angelegt werden soll daxServer.setMaintainSession(true); Von diesem Punkt an können die Methoden des Web Service aufgerufen werden. Z.B. für die Methode Buy(): System.out.print("Geben Sie den Namen der AG ein> "); inAG = inputStream.readLine(); System.out.print("Geben Sie die Menge an Aktien ein> "); inMenge = Integer.parseInt(inputStream.readLine()); if (daxServer.bBuy(inAG,inMenge)) { // "Kauf von "+inMenge+" Aktien von "+ inAG+" war erfolgreich."; } else { // "Kauf von "+inMenge+" Aktien von "+inAG+" ist fehlgeschlagen!"; } Durch das Hinzufügen der Client-Programmlogik und der nötigen import-Anweisungen entsteht die Client Applikationsklasse (DaxWSClient gennant), die im letzten Schritt übersetzt werden kann: javac DaxWSClient.java Nun können Sie den neu entwickelte Web Service mit der Client Applikation testen: java DaxWSClient Die nötigen Kommandos können in einem Skript zusammengefasst werden: ----------------------------------------------------# Client (Session Management with Cookies!) # Voraussetzung: die Datei Dax.wsdl ist vorhanden. # java org.apache.axis.wsdl.WSDL2Java -d Session \ -p ToyDax.wscookie.Dax_PKGwsdl Dax.wsdl javac ToyDax/wscookie/Dax_PKGwsdl/*.java javac DaxWSClient.java III. Der TCP-Monitor Der TCP-Monitor von Axis bietet die Möglichkeit, die an einen Web-Service gesendeten und vom Web Service empfangenen SOAP Nachrichten im Klartext einzusehen. Deshalb ist dieses Tool (Protokoll-Sniffer) sehr gut für die Fehlerbehebung geeignet. Der TCP-Monitor schaltet sich zwischen den Dienstbenutzer und den Dienstanbieter und ist somit in der Lage, ein- und ausgehende Nachrichten zu protokollieren. Der TCP-Monitor wirkt dabei, wie in Abbildung 4 angedeutet, als Brücke zwischen Client und Server. Abbildung 4. Arbeitsweise des TCP-Monitor Der Client darf nun nicht mehr direkt den Web-Service ansprechen, sondern den zwischengeschalteten TCP-Monitor, welcher die Anfrage an den Web-Service weiterleitet. Er darf also nicht mehr den Port von Tomcat ansprechen, sondern den Port des TCP-Monitors (listenport in Abbildung 4). Um das zu erreichen, können Sie entweder bei der Erzeugung des WSDL-Dokuments diese Port-Nummer spezifizieren, oder (einfacher) im Client statt der Anweisung ToyDaxServCookieSoapBindingStub daxServer = (ToyDaxServCookieSoapBindingStub)ServiceLocator.getToyDaxServCookie(); die Anweisung ToyDaxServCookieSoapBindingStub daxServer = (ToyDaxServCookieSoapBindingStub)ServiceLocator.getToyDaxServCookie( new java.net.URL( "http://localhost:7117/axis/services/ToyDaxServCookie")); verwenden, d.h. im Client den zu benutzenden Endpunkt direkt angeben (die 7117 sei hier der vom TCP-Monitor verwendete Port). Der TCP-Monitor visualisiert dann anschließend die Daten, bevor er sie an den Server übergibt. Sobald der Server eine Antwort an seinen Client (jetzt den TCP-Monitor) sendet, werden die Informationen wiederum visualisiert, bevor der TCP-Monitor diese wieder an den eigentlichen Client zurücksendet. Das Tool soll folgendermaßen gestartet werden: java org.apache.axis.utils.tcpmon [<listenport> [<targetHost> <targetPort>]] In unserem Fall sind die Parameter so zu setzen: ein beliebiger freier Port z. B. 7<UserID>7 <targetHost>: localhost (oder Hostname des Tomcat Servers) <targetPort>: 8080 (bzw. Ihr Tomcat-Port) <listenport>: wobei <UserID> die letzten beiden Ziffern ihres Logins sind (z.B. Login csp056 --> Portnummer 7567). Verwenden Sie immer diese Portnummer, damit keine Kollisionen mit anderen Übungsteilnehmern auftreten. Nachfolgend ist der mit dem TCP-Monitor aufgezeichnete Kommunikationverlauf zwischen Client und Web Service (Server) dargestellt,. wenn die Operationen 1,2 und 7 ausgeführt werden. Es wird angenommen, daß der Client-Code die folgenden wählbaren Operationen hat: 0 - Exit 1 - All AGs 2 - Value 3,4 - BigWinnerAG/BigWinnerGain 5 - Variance 6 - Tendence 7 - Buy 8 - Sell 9 - StockAmount 10 - StockValue 11 - CashBalance ========================================================== Select an option: 1 ========================================================== Request: POST /axis/services/ToyDaxServCookie HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.2.1 Host: localhost:7567 Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 362 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:AGs soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"/> </soapenv:Body> </soapenv:Envelope> Response: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=66CFAABA5FA9BD105F6D29CBC5FF58D8; Path=/axis Content-Type: text/xml;charset=utf-8 Date: Tue, 24 Jan 2006 17:59:07 GMT Connection: close <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:AGsResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"> <AGsReturn soapenc:arrayType="soapenc:string[29]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <AGsReturn xsi:type="soapenc:string">ADIDAS-SALOMON AG</AGsReturn> <AGsReturn xsi:type="soapenc:string">ALLIANZ AG VNA O.N</AGsReturn> <AGsReturn xsi:type="soapenc:string">ALTANA AG O.N.</AGsReturn> <AGsReturn xsi:type="soapenc:string">BASF AG O.N.</AGsReturn> ... <AGsReturn xsi:type="soapenc:string">TUI</AGsReturn> <AGsReturn xsi:type="soapenc:string">Volkswagen</AGsReturn> </AGsReturn> </ns1:AGsResponse> </soapenv:Body> </soapenv:Envelope> ========================================================== Select an option: 2 Geben Sie den Namen der AG ein> BMW Geben Sie den Tag ein> 7 ========================================================== Request: POST /axis/services/ToyDaxServCookie HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.2.1 Host: localhost:7567 Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 682 Cookie: JSESSIONID=66CFAABA5FA9BD105F6D29CBC5FF58D8 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:Value soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"> <in0 href="#id0"/> <in1 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> BMW </in1> </ns1:Value> <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 7 </multiRef> </soapenv:Body> </soapenv:Envelope> Response: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=CA26F55338B2FCDC28C20401360A325A; Path=/axis Content-Type: text/xml;charset=utf-8 Date: Tue, 24 Jan 2006 18:10:20 GMT Connection: close <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:ValueResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"> <ValueReturn href="#id0"/> </ns1:ValueResponse> <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:double" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 21.49 </multiRef> </soapenv:Body> </soapenv:Envelope> =============================================================== Select an option: 7 Geben Sie den Namen der AG ein> BMW Geben Sie die Menge an Aktien ein> 100 --------------Response------------------7. Kauf 100 Aktien von BMW war erfolgreich. ----------------------------------------=============================================================== Request: POST /axis/services/ToyDaxServCookie HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.2.1 Host: localhost:7567 Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 680 Cookie: JSESSIONID=CA26F55338B2FCDC28C20401360A325A <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:Buy soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"> <in0 xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > BMW </in0> <in1 href="#id0"/> </ns1:Buy> <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > 100 </multiRef> </soapenv:Body> </soapenv:Envelope> Response: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=9D64F3C9FEE850973FB5B07B14A3F178; Path=/axis Content-Type: text/xml;charset=utf-8 Date: Tue, 24 Jan 2006 18:17:12 GMT Connection: close <?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:BuyResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="services:Dax"> <BuyReturn href="#id0"/> </ns1:BuyResponse> <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:boolean" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > true </multiRef> </soapenv:Body></soapenv:Envelope> Die Session-Informationen werden nicht in die SOAP-Nachrichten eingefügt, sondern in die HTTPInformationen. Weil der Axis-Laufzeitumgebung beim Deployment mitgeteilt wurde, dass dieser Web Service als Session behandelt werden soll, fügt das Axis-Servlet bei Erzeugung der SOAP-Antwort die HTTP-Information ein: Set-Cookie: JSESSIONID=66CFAABA5FA9BD105F6D29CBC5FF58D8; Path=/axis Diese Information wird von der Stub-Klasse auf Clientseite erkannt, ausgewertet und bei jedem nachfolgenden RPC (dem Aufruf einer neuen Methode) an den Server übergeben: Cookie: JSESSIONID=66CFAABA5FA9BD105F6D29CBC5FF58D8 Begriff: Cookies sind kleine Textdateien, die auf dem Clientrechner abgelegt werden. Sie erhalten Informationen, die bei der nächsten Anfrage des Clients mit übertragen werden, um auf der Serverseite festzustellen zu können, welcher Client gerade anfragt.