Der Flash Sandkasten
Jedem Flash und Java Applet Entwickler ist die Thematik der sogenannten Sandkastenumgebung der Standardbrowser bekannt. Applikationen, die über das Internet aufgerufen werden, haben nur eingeschränkte Zugriffsrechte auf dem Clientrechner.
Solche Anwendungen können nicht auf das lokale Dateisystem zugreifen und nur uneingeschränkt auf Resourcen des Servers zugreifen, von dem sie geladen wurden.
Mit der crossdomain.xml kann diese Einschränkung zwar umgangen werden, dafür braucht der Entwickler jedoch Zugriff auf den Server, auf dem die benötigten Resourcen installiert sind. Das ist jedoch in den seltensten Fällen so.
Ohne Proxy Service können die Services
mx.rpc.http.HttpService und der
mx.rpc.soap.WebService mit dem Parameter
url nur Daten von dem Server abrufen, von dem sie selbst geladen wurden.
Mit dem Proxy können die Services auch auf Resourcen anderer Server zugreifen. Die Clientanwendung merkt davon nichts. Der Request wird nach wie vor an den eigenen Server gestellt. Die Proxy Kompenente des LiveCycle Dataservice nimmt die Anfrage entgegen und leitet sie an den entsprechenden Server im Netz weiter. Dafür muss die Eigenschaft
useProxy auf
true gesetzt werden, nur dann spricht der Proxy Service auch an und liest gegebenenfalls die Eigenschaft
destination aus.
Der url Parameter
Im folgenden gehen wir von einer Applikation mit dem Namen myApplication aus, die einen
HTTPService enthält. Der Sourcecode sieht vereinfacht so aus:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"">
<!-- ............ -->
<mx:HTTPService id="myService" url="data/myDataFile.xml" />
<!-- ............. -->
</mx:Application>
Das Programm lädt die Daten vom eigenem Server, das Verzeichnis "data" befindet sich dabei auf der gleichen Ebene wie das swf-File der Flexapplikation.
Im
url Parameter kann auch eine absolute Adresse angegeben werden. Vorausgesetzt die Applikation wird über die URL http://localhost/myApplication aufgerufen, kann auch dieser Code verwendet werden.
<mx:HTTPService id="myService" url="http://localhost/data/myDataFile.xml" />
Das funktioniert nicht und löst einen Cross Domain Security Error aus!
<mx:HTTPService id="myService" url="http://127.0.0.1/data/myDataFile.xml" />
Die Default Destination
Unter einer Destination ist der Endpunkt einer Kommunikationskette zu verstehen. Auch in der Webservice Entwicklung wird der Begriff Endpunkt (natürlich in englisch -> endpoint ) verwendet. Damit eine bestimmte Ressource über den Proxy Service angesprochen werden kann, müssen in der
proxy-config.xml einige Einstellungen vorgenommen werden. Die
proxy-config.xml sieht im Normalfall so aus.
Die proxy-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<service id="proxy-service"
class="flex.messaging.services.HTTPProxyService"
messageTypes="flex.messaging.messages.HTTPMessage,flex.messaging.messages.SOAPMessage">
<properties>
<connection-manager>
<max-total-connections>100</max-total-connections>
<default-max-connections-per-host>2</default-max-connections-per-host>
</connection-manager>
</properties>
<adapters>
<adapter-definition id="http-proxy"
class="flex.messaging.services.http.HTTPProxyAdapter"
default="true" />
<adapter-definition id="soap-proxy"
class="flex.messaging.services.http.SOAPProxyAdapter" />
</adapters>
<default-channels>
<channel ref="my-http" />
<channel ref="my-amf" />
</default-channels>
<destination id="DefaultHTTP">
<!-- Einträge der Default Remoteserver -->
</destination>
</service>
Standardmäßig ist in der
proxy-config.xml bereits ein Eintrag für die Default Destination vorhanden, dieser ist jedoch leer.
Um Proxy Zugriffe über den Flex Data Service zu ermöglichen, muss der Eintrag erweitert werden.
Ergänzung der Destination
<destination id="DefaultHTTP">
<properties>
<dynamic-url>http://127.0.0.1:8700/*</dynamic-url>
</properties>
</destination>
Der Stern am Ende der URL ermöglicht dem Flex Client auf jeden möglichen Webservice des (scheinbar) entfernten Servers zuzugreifen.
Zum genaueren Verständnis.
Hier im Beispiel stellt der der Server mit der IP 127.0.0.1 den Remoteserver dar. Die Clientanwendung, aufgerufen über http://localhost:8700/myApplication kann im Normalfall nicht auf den den eigenen Server über die URL http://127.0.0.1:8700 zugreifen. Die crossdomain-policy sieht in den Servern mit den URL's http://localhost und http://127.0.0.1 zwei verschiedene Hosts.
Um in einer Entwicklungsumgebung mit dem Proxy Service zu experimentieren eignen sich diese URL's gut, um zwei unterschiedliche Server zu simulieren.
Nun muss noch im
HTTPService die
useProxy Eigenschaft auf
true gesetzt werden.
<mx:HTTPService
id="myService"
url="http://127.0.0.1/data/myDataFile.xml"
useProxy="true" />
Der HTTPService ist nun in Lage die Resource
myDataFile.xml über den Umweg des Proxy Service vom (vermeintlich) entfernten Server abzurufen.
Die Named Destination
Mit der named Destination entscheidet der Client nicht mehr selbst, welche URL, von welchen Remoteserver aufgerufen wird. Dem Client ist lediglich die Id des Services bekannt. Den Proxy Service mit der richtigen URL zu spezifizieren, liegt nun in der Hand der Servers. Dadurch wird die Sicherheit des Systems beachtlich erhöht. Anwendungen auf Clientseite können nicht mal eben verschiedene URL's ausprobieren.
Der geanderte Eintrag in der proxy-config.xml
<destination id="myProxyService">
<properties>
<url>http://127.0.0.1:8700/flex/data/myService.xml</url>
</properties>
</destination>
Statt einer URL wird im
HTTPService jetzt der Parameter
destination verwendet. Die Destination, die im
HTTPService angegeben wird, muss mit der Destination Id in der
proxy-config.xml übereinstimmen.
Im HTTPService wird die enfernte Ressource uber die Id aufgerufen
<mx:HTTPService
id="myService"
destination="myProxyService"
useProxy="true" />
01 Juli 2007