# Java und MySQL in Applets auf Webserver



## tbjava (8. Juni 2006)

Hallo ich habe ein kleines Problem und hoffe hier Hilfe zu finden.

Ich habe ein Java Applet programmiert, dass auf einem Webserver liegt und auf eine MySQL-Datenbank zugreiffen soll.
Die verwendete MySQL-Datenbank hat die Version 4.0.15-Max und liegt auf einem Server der auf SuSE 9.3 läuft.
Ich habe die Appletversion auf meinem lokalen Rechner ausprobiert und der Zugriff funktioniert. 
Als JDBC-Treiber verwende ich einen MySQL-Connector-Java-3.0.15-ga-bin.jar den ich gem. Lehrbuch kopiert, unbenannt und zu einer gemeinsamem JAR-Verzeichnis zusammengefasst habe. Einen entsprechenden Archiv-Verweis in der HTML-Seite habe ich auch eingetragen, wie gesagt auf dem lokalen Rechner war das auch kein Problem.
Übertrage ich das nun auf den Server (HTML und JAR Datei in einem Verzeichnis und Datenbank als localhost) bekomme ich kein Resultat, auf den Aufruf, die Datenbank bleibt leer.

Was kann ich tun um das Problem zu lösen? 
- muss ich ggf. Einstellungen an dem Server erweitern? -Apache-Webserver
- gibt es eine andere Vorgehensweise um eine Connection zu bekommen?
- gibt es bessere Connectoren? -spezielle für die verwendete MySQL-Version?

Vielen Dank für Eure Bemühungen und Tip`s im Vorraus.
Torsten B.
Hamburg


----------



## Thomas Darimont (8. Juni 2006)

Hallo!

Um von einem Applet zu einer MySQL Datenbank Verbindung aufbauen zu koennen muessen ein paar
Voraussetzungen erfuellt sein:
1) Auf der Serverseite muss die MySQL Datenbank nach aussen sichtbar sein. D.h. sie muss auf einem
Port (3306) auf verbindungen von extern lauschen koennen. Das setzt voraus, dass die Datenbank im
"Netzwerkmodus" gestartet und entsprechende Zugriffsberechtigungen fuer externe User erteilt worden sind.
2) Das jar File mit dem MySQL Treiber muss dem Applet zur Verfuegung stehen. D.h. es muss im Classpath
des Applets sein. Das geht am besten ueber das "archive"-Attribut des Applet-Tags.
3) U.u muss man dem Applet die entsprechenden Permissions zur Verwendung des JDBC API geben. 
Man kann das Applet auch signieren und ihm somit alle Rechte geben.

Dieser Ansatz beherbergt natuerlich sicherheitstechnische Probleme, da so jeder der das Applet
Dekompiliert an die Zugangsdaten zur Datenbank herankommt.

Ein besserer Weg waere der indirekte Zugriff auf die Datenbank ueber einen Vermittler / Mediator.
Als Vermittler koennte beispielsweise ein Servlet (oder PHP Script) dienen. Dann reicht es auch aus die mysql nur
lokal fuer das Servlet zugreifbar zu machen. Weiterhin gibt man auf diese Weise auch keine 
Login Informationen frei.

Dein Applet koennte dann eine Anwendungsspezifische Abfrage an das Servlet abschicken. Das Servlet
wandelt diese Abfrage in eine SQL Abfrage um und setzt das auf der Datenbank ab. Anschliessend
schickt das Servlet das Abfrageresultat in irgendeiner Form (Serialisierte Objekt, XML...) an das 
Applet zurueck welches dann die Darstellung des Ergebnisses uebernimmt.

Gruss Tom


----------



## A5 Infoschlampe (12. August 2006)

Hallo,

habe selbst die letzten 2 Tage sämtliche Foren durchgelesen und nun die Lösung gefunden.
Wollte Sie langlebig nun der öffentlichkeit vorstellen.

Folgende Aktionen muss man tätigen, wenn man die Sicherheitsprobleme bezügl. eines eventuellen Decompilieren und Passwortauslesen in Kauf nimmt:

*Jar File erstellen und mit Signatur ausstatten um Volle Zugriffsrechte zu bekommen
hier

* dann das Java Connector Jar holen und (zum Beispiel) ins gleiche Verzeichnis stellen.

* die index.html könnte so aussehen (wenn beide JARs signiert im gleichen Verzeichnis liegen):


```
<object
    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,9"
    WIDTH = "915" HEIGHT = "620" >
    <PARAM NAME = CODE VALUE = "Paktename.StartappletnameOhneClassEndung" >
    <PARAM NAME = CODEBASE VALUE = "." >
    <PARAM NAME = NO_CACHE VALUE = "no" >
    <PARAM NAME = ARCHIVE VALUE = "JARdatei_1.jar,JARdatei_2mysql-connector-java-5.0.3-bin.jar" >
    <param name = "type" value = "application/x-java-applet;version=1.5">
    <param name = "scriptable" value = "false">

    <comment>
	<embed
            type = "application/x-java-applet;version=1.5" \
            CODE = "Paktename.StartappletnameOhneClassEndung" \
            JAVA_CODEBASE = "." \
            NO_CACHE = "no" \
            ARCHIVE = "JARdatei_1.jar,JARdatei_2mysql-connector-java-5.0.3-bin.jar" \
            WIDTH = "915" \
            HEIGHT = "620"
	    scriptable = false
	    pluginspage = "http://java.sun.com/products/plugin/index.html#download">
	    <noembed>
            <h1>Loading</h1>
            </noembed>
	</embed>
    </comment>
</object>
```


Wichtig hierbei ist, dass der MYSQLCONNECOR im Archive-Tag als Zweitparameter hinzugefügt wird. Viele User wundern sich, warum Ihr Applet lokal in Eclipse läuft. Na ganz klar: Dort ist es ja intern mit eingebunden, und bei Browser ausführung eben standardmässig nicht!


* Nun funktioniert die Lokale Verbindung zur Datenbank auf dem Localhost, aber um jetzt von anderen Clients Anfragen zu erhalten, muss der Fremdzugriff direkt in der MySql USER Tabelle geupdated werden:
Siehe Besonders Punkt 2 von Hier


```
update user set host='%' where user='DEINUSERNAME';
update db set host='%' where user='DEINUSERNAME';
```


et voilà ... somit bekommt man ein Java Applet vom Web aus auf den Client geladen, welches die Daten in der serverseitigen Datenbank pflegt.

Übrigens: Bilderupload etc. ist alles kein Problem und funktioniert damit auch reibungslos, wenn man diese z.B. binär in ein LongBlob Feld speichert.

Hoffe ich kann mit diesem kleinen Beitrag andern Usern Tagelange Suche ersparen.
 

Gruß


----------

