# Applets für Datenbankzugriff signieren



## XPlox (14. Dez 2007)

Hi,

ich hab jetzt schon viel gelesen und auch schon teilweise verstanden, dass man mit einem Applet nur auf eine Datenbank zugreifen kann, wenn man es vorher signiert hat. 
Kann mir jetzt mal bitte jemand erklären. ... wenn möglich von a bis z wie ich das mit der Signatur genau machen muss. 
Ich hab da schon so das ein oder andere versucht, aber das hat leider nicht funktioniert.


```
@SET KEYSTORE=keystore.file

@SET STOREPASS=meinpassword

@SET CERTALIAS=meinalias


keytool -genkey -alias %CERTALIAS% -dname "cn=Visualize.It, ou=Trusty1, o=Trusty2, c=de" -keystore %KEYSTORE% -storepass %STOREPASS% -validity 36500 -keypass %STOREPASS%


jarsigner -verbose -keystore %KEYSTORE% -storepass %STOREPASS% GUI.jar %CERTALIAS%
```

Das Applet an sich funktioniert, wenn ich es mit Eclipse ausführen will auch einwandfrei. Im Browser allerdings nicht. Da gibt es diverse Probleme. Teilweise mit dem Logging, teilweise mit dem Aufbauen der DB Verbindung. Das hab ich jetzt aber schon so weit gelöst.

Wenn ich das Applet jetzt ohne Prefuse und Freechart starte funktioniert auch alles. Allerdings sobald ich die Anwendungen noch dazu lade geht es nicht mehr. 
Der Codeaufruf im HTML lautet:


```
...
<applet code="com.vit.applet.launch.Visualizer.class" 
		archive="GUI.jar, jfreechart-1.0.7.jar, commons-logging-1.1.jar, 
				looks-2.1.4.jar, prefuse-2.1.4.jar, jcommon-1.0.12.jar,
				mysql-connector-java-5.0.5-bin.jar, log4j-1.2.15.jar" 
		width="800" height="600" 
		alt="Java-Applet konnte nicht geladen werden">
</applet> 
...
```


Bei dem Teil der Freechart betrifft, liegt es definitiv an der DB Verbindung. Zumindest bricht er an der Stelle ab an der es gilt das PreparedStatement auszuführen. 

Bei Prefuse bekomme ich folgende Fehlermeldung:


```
java.lang.NoClassDefFoundError: prefuse/Display
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$000(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at sun.applet.AppletClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.applet.AppletClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at com.vit.applet.VItApplet.initGUI(VItApplet.java:68)
	at com.vit.applet.VItApplet.<init>(VItApplet.java:57)
	at com.vit.applet.launch.Visualizer.<init>(Visualizer.java:23)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.applet.AppletPanel.createApplet(Unknown Source)
	at sun.plugin.AppletViewer.createApplet(Unknown Source)
	at sun.applet.AppletPanel.runLoader(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```

und manchmal auch


```
java.lang.NoClassDefFoundError: com/vit/util/CRadialGraphView
	at com.vit.applet.VItApplet.initGUI(VItApplet.java:68)
	at com.vit.applet.VItApplet.<init>(VItApplet.java:57)
	at com.vit.applet.launch.Visualizer.<init>(Visualizer.java:23)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.applet.AppletPanel.createApplet(Unknown Source)
	at sun.plugin.AppletViewer.createApplet(Unknown Source)
	at sun.applet.AppletPanel.runLoader(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```


Wäre froh wenn mir jemand helfen könnte.
Schon mal danke ..


----------



## The_S (14. Dez 2007)

Ein NoClassDefFoundError hat normal nichts mit Datenbankabfragen zu tun. Sondern es werden einfach nur irgendwelche Klassen nicht gefunden. In deinem Fall die Klassen com/vit/util/CRadialGraphView  und prefuse/Display.

Siehe FAQ:

http://www.java-forum.org/de/viewtopic.php?t=1527
http://www.java-forum.org/de/viewtopic.php?t=18083


----------



## XPlox (14. Dez 2007)

Hey ...
erst mal danke für den Tipp...
Das Applet läuft jetzt soweit. Allerdings nur lokal. Was muss ich jetzt noch machen, wenn ich das Applet auch im Netz ausführen will. Könnt ihr mir vielleicht sagen, wie ich die db.properties im Jar File angeben muss, damit ich die Datenbankverbindung erfolgreich aufbauen kann.

Momentan siehts so aus. 


```
public static String DB_PROPERTIES = "/WebContent/properties/db.properties";

	public Connection get_Connection() throws SQLException
	{
		LOG.info("com.vit.db.DB_Object");
		Connection cn = null;
		try
		{
			Properties props_db = new Properties();
			
			try {
				props_db.load(new FileInputStream(DB_PROPERTIES));
				   
			} catch (FileNotFoundException e) {
				if(LOG.isErrorEnabled())
					LOG.error("com.vit.db.DB_Object\n --> propertiesfiles not found:\n --> " + e.toString());
			} catch (IOException e) {
				if(LOG.isErrorEnabled())
					LOG.error("com.vit.db.DB_Object\n --> proplems while loading the propertiesfiles:\n --> " + e.toString());
			}

	    	String drv = props_db.getProperty("driver");
	    	Class.forName(drv);
	    	
	    	String usr = props_db.getProperty("user");
	    	String pwd = props_db.getProperty("pass");
	    	String url = props_db.getProperty("url");
/*			
			String drv = "com.mysql.jdbc.Driver";
			Class.forName(drv);
			String usr = "jdbc:mysql://127.0.0.1:3306/db46373x606438?autoReconnect=true";
			String pwd = "visualize.it";
			String url = "face";
*/
	    	if(LOG.isTraceEnabled()){
	    		LOG.trace("\n DRV: " + drv + "\n USR: " + usr + "\n PWD: " + pwd + "\n URL: " + url);	
	    	}
	    	
	    	cn = DriverManager.getConnection(url, usr, pwd);
	    	LOG.info("DBObject::get_Connection()\n " +
	    				"--> DB Connection established\n");
		}
		catch(Exception e)
		{
			LOG.error("DBObject::get_Connection()\n " +
						"--> Problems while reading DB Connection data\n " +
						"--> " + e.toString());
		}
		return cn;
		
	}//get_Connection
```

Na ja und da kann das Applet irgendwie nicht drauf zugreifen. Zumindest bekomme ich immer eine NullPointerException in der ersten Klasse die die Connection verwendet!
Der Pfad an sich müsse allerdings stimmen. Wenn ich es lokal absolut adressiere funktioniert es zumindest mit localhost. Aber nicht im Web. Und das ist das Ziel ... --> da muss es hin.


----------



## Wildcard (14. Dez 2007)

```
"/WebContent/properties/db.properties";
```
Das ein Applet auf dem Client läuft und daher nicht einfach Dateien aus dem Dateisystem des Hosts laden kann ist dir bewußt?


----------



## The_S (14. Dez 2007)

Wenn du alles in einem JAR hast, dann musst du anders auf Ressourcen zugreifen => über den ClassLoader.


----------



## Wildcard (14. Dez 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Wenn du alles in einem JAR hast, dann musst du anders auf Ressourcen zugreifen => über den ClassLoader.


Will man wirklich eine .properties in eine jar packen die user, passwort und url einer Datenbank enthalten?


----------



## The_S (14. Dez 2007)

nö :lol: . Muss zu meiner Schande gestehen, dass ich den Beitrag nur überflogen habe. Und so von der anfänglichen Beschreibung ist der Verdacht gleich auf: lokal => kein jar, web => jar gefallen


----------



## XPlox (14. Dez 2007)

Na ja, ob man das will ist hier nicht die Frage. 
Wie kann ich es denn lösen, so dass es funktioniert? Wenn ich nicht auf den Host zugreifen kann muss ich die properties doch mit in das jarfile stecken. 

Gibt es nicht auch die Möglichkeit das JAR File so zu versiegeln?

Wie ihr gesehen habt, hab ich auch schon versucht die Vars direkt im DB Object anzugeben. Da bin ich aber auch kläglich gescheitert. 
--> NULLPOINTEREXCEPTION


----------



## The_S (14. Dez 2007)

Von Applets aus auf Datenbanken zuzugreifen ist immer mit Risiko verbunden!

a.) Daten hardcodiert in das Applet eincodieren => Applet wird decompiled und die Daten können angesehen werden
b.) Daten als Propertie in das JAR legen => JAR wird geöffnet, properties-file ist für jeden einsehbar
c.) Applet läd Daten von nem Server => Applet wird decompiliert, die Kommunikation mit dem Server/der Ort der Properties-Datei wird ausgelesen => Daten können manuel abgefragt werden


----------

