# Applet bekommt keinen Datenbankzugriff



## Thomas123 (24. Apr 2006)

Abend,

ich habe ein Applet (login.jar) welches auf eine MYSQL-Datenbank Zugriff haben soll. Sich daraus das Passwort für einen bestimmten Nutzer herausholt und dann die Eingabe mit dem Inhalt des dazugehörigen Datenbankeintrages vergleicht.
Wenn alles okay ist, wird auf eine "Welcome"-Seite umgeleitet in allen anderen Fällen (Drücken von Cancel und falsche Login-Daten) wird der Zugriff verweigert.

Das Applet ist signiert und funktioniert soweit auch. Aber irgendwie geht der Zugriff auf die Datenbank in die Hose.
Programmiert wurde der ganze Spass in Eclipse wo die Durchführung auch wunderbar funktioniert.
Nur im Browser (Firefox & IE) geht es leider nicht.

Ich vermute, dass das Applet trotz Signatur noch eingeschränkt ist. Warum auch immer. Ich habe in meinem Workspace von Eclipse noch eine *java.policy.applet* gefunden. Diese Datei ließ sich auch mit dem Policytool vom SDK öffnen. Muss ich diese Datei noch in dem JAR unterbringen? Wenn ja, wie? Oder nur auf den Server werfen und in meiner Manifestdatei nen Verweis darauf bringen?


Wäre nett, wenn mir Jemand nen Tipp geben könnte.


Grüße Thomas


PS: Installiert habe ich das J2SDK1.4.2_11!


----------



## Thomas123 (24. Apr 2006)

So, da ich ja nun auch nicht untätig bin, habe ich die Fehlerquelle eventuell schon gefunden. Ich vermute, dass das Applet den JDBC-Treiber nicht finden kann. 

Muss ich den Treiber nur in das Verzeichnis legen, wo auch die JAR ist oder muss der Treiber in die JAR eingebunden werden? Habe zwar beides schon versucht und noch keinen Erfolg gehabt, aber vielleicht mache ich ja auch was falsch....

nur bitte was?


----------



## SamHotte (25. Apr 2006)

Ist 'ne Weile her, aber vom Prinzip her brauchst du für das Applet eine policy, die den Datenbankzugriff erlaubt. Ich hab den Code dafür irgendwo zu Hause rumfliegen und schaue gerne heute abend mal nach - war ein ziemliches Gefrickel damals.


----------



## Thomas123 (25. Apr 2006)

Hey,

das wäre echt nett, wenn du da mal nachschauen würdest heute Abend. Danke schonmal fürs Posten.


Thomas


----------



## L-ectron-X (26. Apr 2006)

Eigentlich sollte es funktionieren, wenn du das Applet signierst, weil es sich ja zu einem anderen Server verbinden soll und nicht nur zu dem, von dem es heruntergeladen wurde.


----------



## Jörn (26. Apr 2006)

Hallo,

ich arbeite auch an dem Projekt von Thomas123:

Also das Applet und der Server auf welchem sich die Datenbank befindet sind gleich. Aber auch das signieren des Applets bringt nichts. Wir haben mittlerweile das Problem, dass wir unter Eclipse alles ausführen können, aber sobald wir die .class Dateien uploaden funktioniert nicht ein Applet oder Klasse.


----------



## Thomas123 (26. Apr 2006)

Hey,

das signieren der Applets hat insoweit was gebracht, dass wir aus der "Sandbox" rausgekommen sind. Aber leider funktioniert der Datenbanktreiber nicht, bzw. er wird nicht geladen. Ich vermute, dass in der manifest-Datei noch nen Eintrag stehen muss, der auf den Ort des Datenbanktreibers verweist. Ich habe versucht mir selber eine Manifest.mf zu schreiben mit einem Class-Path, dass ganze in ein .jar-File gepackt. Jedoch beim Signieren wird die Manifest.mf neu geschrieben und alle meine Änderungen sind weg.

Grundprinzipiell funktioniert das Applet im signierten Zustand auch, nur wird der Datenbanktreiber nicht gefunden und meine Class-Datei, die die Abfrage zur Datenbank übernimmt, liefert nen "Null-Wert" zurück. Das konnte ich schon testen.

Wenn mir da noch jemand weiterhelfen könnte, wäre echt klasse.

Ich habe auch schon versucht, den JDBC-Treiber zu entpacken und wieder in die .jar zu packen, den JDBC-Treiber als .jar in mein Applet zu packen, bzw. den JDBC-Treiber einfach mit auf den Webspace... aber alles hat noch nichts gebracht...

Ich hoffe das ich heute noch die Lösung finden würde. Langsam sitzt mir/uns die Zeit im Nacken.


Gruß Thomas


----------



## SamHotte (26. Apr 2006)

Leider hat meine Suche nicht wirklich geholfen - ich hatte damals das Applet mit einer "AllPermission" ausgestattet, da ich keine Zeit für weitere Dinge hatte - sorry.

Vllt. hilft es aber weiter: meine Anwendung war zweigeteilt in Server und Applet, die beiden haben sich per RMI unterhalten; der Server hat die Datenbankzugriffe gemacht und in seiner Policy einen Eintrag mit "java.io.FilePermission" drin - vielleicht benötigt man die für den Treiber?


----------



## L-ectron-X (26. Apr 2006)

Läuft denn auch irgendwo ein Datenbankserver?


----------



## SamHotte (26. Apr 2006)

@L-ectron-X
War die Frage für mich? Ja, damals lief ein DB-Server (DB2) auf dem selben Rechner wie der "Applikationsserver", der den Server-Teil meiner Anwendung hostete.


----------



## L-ectron-X (26. Apr 2006)

Sorry Sam, die war nicht an dich gerichtet. Ist aber auch nicht schlimm. :wink: 
Die Frage ging an den/die TO's. Bisher kam nicht zur Sprache, ob denn irgendwo ein DB-Server läuft, auf den das Applet zugreifen könnte.


----------



## Thomas123 (26. Apr 2006)

Hey,

also, ich habe das Problem gelöst!

Folgendes wurde gemacht. Wir haben uns einen "neuen" SecurityManager geschrieben. Der wurde mit in mein Applet eingebunden.

Er sieht wie folgt aus:

*SecurityMngr.java*

```
import java.io.FileDescriptor;
import java.net.InetAddress;
import java.security.Permission;

/*
 * Created on 26.04.2006 by Andreas Wolff, Universität Rostock
 * as part of AppletTest
 */

public class SecurityMngr extends SecurityManager {

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkAccept(java.lang.String, int)
     */
    public void checkAccept(String host, int port) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkAccess(java.lang.Thread)
     */
    public void checkAccess(Thread t) {
        return;    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkAccess(java.lang.ThreadGroup)
     */
    public void checkAccess(ThreadGroup g) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkAwtEventQueueAccess()
     */
    public void checkAwtEventQueueAccess() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkConnect(java.lang.String, int, java.lang.Object)
     */
    public void checkConnect(String host, int port, Object context) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkConnect(java.lang.String, int)
     */
    public void checkConnect(String host, int port) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkCreateClassLoader()
     */
    public void checkCreateClassLoader() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkDelete(java.lang.String)
     */
    public void checkDelete(String file) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkExec(java.lang.String)
     */
    public void checkExec(String cmd) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkExit(int)
     */
    public void checkExit(int status) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkLink(java.lang.String)
     */
    public void checkLink(String lib) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkListen(int)
     */
    public void checkListen(int port) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkMemberAccess(java.lang.Class, int)
     */
    public void checkMemberAccess(Class clazz, int which) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkMulticast(java.net.InetAddress)
     */
    public void checkMulticast(InetAddress maddr) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPackageAccess(java.lang.String)
     */
    public void checkPackageAccess(String pkg) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPackageDefinition(java.lang.String)
     */
    public void checkPackageDefinition(String pkg) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPermission(java.security.Permission, java.lang.Object)
     */
    public void checkPermission(Permission perm, Object context) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPermission(java.security.Permission)
     */
    public void checkPermission(Permission perm) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPrintJobAccess()
     */
    public void checkPrintJobAccess() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPropertiesAccess()
     */
    public void checkPropertiesAccess() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkPropertyAccess(java.lang.String)
     */
    public void checkPropertyAccess(String key) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkRead(java.io.FileDescriptor)
     */
    public void checkRead(FileDescriptor fd) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkRead(java.lang.String, java.lang.Object)
     */
    public void checkRead(String file, Object context) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkRead(java.lang.String)
     */
    public void checkRead(String file) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkSecurityAccess(java.lang.String)
     */
    public void checkSecurityAccess(String target) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkSetFactory()
     */
    public void checkSetFactory() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkSystemClipboardAccess()
     */
    public void checkSystemClipboardAccess() {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkTopLevelWindow(java.lang.Object)
     */
    public boolean checkTopLevelWindow(Object window) {
        return true;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkWrite(java.io.FileDescriptor)
     */
    public void checkWrite(FileDescriptor fd) {
        return;
    }

    /* (non-Javadoc)
     * @see java.lang.SecurityManager#checkWrite(java.lang.String)
     */
    public void checkWrite(String file) {
        return;
    }

}
```

Sind zwar nen bischen viele Eigenschaften, aber da muss man sich dann raussuchen was man braucht.
Eingebunden wird der dann mit folgendem Befehl:


```
System.setSecurityManager(new SecurityMngr());
```

Und dann muss man noch einen Class-Path in die Manifest-Datei von der .jar noch den Class-Path auf den Treiber setzen. Zum Beispiel so:


```
Class-Path: mysql-connector-java-3.1.12-bin.jar
```

Tjoa, dann halt das Applet noch signieren, den Datenbanktreiber in den selben Ordner vom .jar packen und dann kann es losgehen.


----------

