# Probleme beim Applet signieren



## HorstHuber (22. Mai 2005)

Ich habe ein Applet geschriegen, in dem *.gif Bilder geladen werden müssen.

Als Application oder auch im Appletviewer funktioniert das natürlich problemlos, aber über einen HTML-Aufruf nicht mehr, da Dateizugriffe für Applets gesperrt sind.

Dazu muß meines wissens ein Applet signiert werden, dann kommt eine sinnlose Sicherheitsabfrage und es läuft einfach.

Das "keytool" und den "jarsigner" habe ich bereits gefunden. Einen Jarfile bekomme ich prinzipiell erstellt und auch signiert.

Jedoch stellt sich die Frage: Wie geht es weiter? Eine Application kann ich aus dem jar File heraus direkt starten, aber wie muß ich mit einem Applet verfahren?
Das will ich nicht in dem *.jar File benutzen, sondern z.B. wieder auf einen FTP Server laden.

Ich kann also einen jar-File signieren, aber am Ende nichts mit anfangen. Wie handhabt man das richtig?

Oder gibt es tatsächlich eine Lösung für das Bilderproblem ohne Signatur?


----------



## Bleiglanz (22. Mai 2005)

du willst ja wohl vom server aus laden?

woher willst du wissen, welche bilder auf dem rechner des clients verfügbar sind??

du musst die bilder einfach vom Server nachladen...


----------



## HorstHuber (22. Mai 2005)

Ich habe die Bilder mit in der Verzeichnisstruktur und diese werden an verschiedenen Stellen des Applets auch geladen.
Die Bilder werden mit auf den Server kopiert oder zu Testzwecken von der Festplatte aus benutzt.

Beim Aufruf über eine HTML Datei erscheint ein Platzhalter für das Applet und die Java console gibt folgende Fehlermeldung:

java.security.AccessControlException: access denied (java.io.FilePermission bilder\setfeld.gif read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkRead(Unknown Source)
	at sun.awt.SunToolkit.getImageFromHash(Unknown Source)
	at sun.awt.SunToolkit.getImage(Unknown Source)
	at KnopfSetup.MaleBild(KnopfSetup.java:54)
	at KnopfSetup.<init>(KnopfSetup.java:31)
	at PanelMaster.<init>(PanelMaster.java:28)
	at Reversi.init(Reversi.java:17)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


Dann bin ich darauf gestoßen, daß man Applets signieren muß für Dateizugriffe. Ist das richtig? Würde das das Problem beheben?


----------



## Bleiglanz (22. Mai 2005)

soll das Applet NUR auf deinem eigenen Rechner arbeiten??


----------



## HorstHuber (22. Mai 2005)

Nein, eigentlich nicht.

Aber ein Anfang wäre es schonmal.

Habe ich vielleicht das Problem falsch verstanden, benutze falsche Methoden zum Bilder laden?

Die Bilder werden auch nicht in der Klasse Applet geladen, sondern in Canvas Klassen.


----------



## HorstHuber (22. Mai 2005)

So, erstmal registriert.


Dann vielleicht die alternative Frage: Kann man mit Applets auf Bilder oder Dateien zugreifen, ohne diese zu signieren? Eigentlich dürfte das doch nicht der Fall sein.

Zudem huscht die Literatur immer sehr oberflächlich über diese Themen hinweg.


----------



## L-ectron-X (22. Mai 2005)

Ich verstehe jetzt noch nicht ganz, wo es hier lang gehen soll...
Du hast das Applet in einem .jar-File und auch bereits signiert. Außerdem ist es auf dem Webserver und wurde auch von dort aus auch schon in den Browser geladen.
Und nun kannst du diese AccessControlException in der Console bewundern und weiß nicht warum?
Du hast leider den Eingangstext so formuliert, dass ich deinem Problem nicht richtig folgen konnte...

Edit: Habe an meinem Beitrag gearbeitet, während du dich registriert hast.
Also grundsätzlich sind Dateioperationen auf Systemebene (lesen, schreiben) für Applets verboten.
Um die Rechte von Applets zu erweitern müssen diese signiert werden.
Ich habe noch nie Canvas benutzt, kann daher auch wenig dazu sagen.
Bilder lade ich mindestens immer mit:

```
Image img = getImage(new URL("http://www.domain.com/images/img1.gif"));
```
http://java.sun.com/j2se/1.5.0/docs/api/java/applet/Applet.html#getImage(java.net.URL)

Ausgabe in der paint()-Methode mit einer passenden drawImage()-Methode aus Graphics.
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Graphics.html


----------



## HorstHuber (22. Mai 2005)

Dann mache ich mal langsam und Schrittweise weiter.

Ich kann eine Applikation in einen *.jar File packen und signieren. Anschließend entweder bei entsprechend konfiguriertem System (meist automatisch) per Doppelklick starten oder auf Kommandozeilenebene von Hand: javaw.exe -jar *.jar

Bei Applikationen funktioniert das auch wunderbar.

Ein Applet bringt mir nur als *.jar File überhaupt nichts, weil ich es doch mittels Appelt-tag in einer *.htm Seite aufrufe und den Platz dort zur Verfügung stelle. Oder kann ich auch irgendwie auf diesen *.jar File zugreifen mittels HTML Code?

Das Kommando "getImage(...)" funktioniert meines Wissens nur in von Applet abgeleiteten Klassen. Ansonsten lautet der volle Befehl "getToolkit().getImage(...)" und wird über java.awt.Toolkit zur Verfügung gestellt. Daher auch das Problem. 

Vielleicht sogar von Anfang an Falsch angegangen?

Ziel ist es:
- Es gibt eine einzige Klasse von Applet abgeleitet ( also class blub extends Applet{...})
- In dieser Klasse werden nur Klassen hinzugefügt, die von Panel abgeleitet sind
- Die Panel Klassen enthalten Instanzen von den von Canvas abgeleiteten Klassen. In diesen werden Bilder geladen.

Sinn und Zweck ist es, daß das Programm gleich aufgebaut ist und wahlweise als Applikation oder Applet aufgerufen werden kann und sich also nur in der "Hauptklasse" unterscheidet.


```
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

public class CanvKnopf
extends Canvas

{
	private int bild;
	private Image img;
	
	
	public CanvKnopf(int bild)
	{
		this.bild = bild;
		MaleBild(bild);	
	}	
	
	public int GetBild()
	{
		return bild;
	}
	
	public void MaleBild(int bild)
	{
		String fname;
			
		if (bild == -1)
		{
			fname = "bilder\\bild1.gif";
		}
		else
		{
			fname = "bilder\\bild2.gif";
		}
		
		
		
		img = getToolkit().getImage(fname);
				
		MediaTracker mt = new MediaTracker(this);		 
		
		mt.addImage(img, 0); 
		try
		{		     
			mt.waitForAll(); // Bild wird vorgeladen
		} catch (InterruptedException e){}
						
		this.repaint();
	}
	
	// legt die Größe des Bildes fest
	public Dimension getPreferredSize()
	{
		return new Dimension(
					img.getWidth(this),
					img.getHeight(this)
					);
	}

	// legt die Größe des Bildes fest	
	public Dimension getMinimumSize()
	{
		return new Dimension(
					img.getWidth(this),
					img.getHeight(this)
					);
	}
	
	// Zeigt das Bild an
	public void paint(Graphics g)
	{			
		g.drawImage(img,0,0,this);

	}
	
}
```


----------



## L-ectron-X (22. Mai 2005)

Dann schreibe lieber eine Webstart-Anwendung (.jnlp)
Ansonsten ist die Grundlage für eine "Appletcation" immer ein Applet.
Ein Applet erbt ja von Panel und kann so einem Frame hinzugefügt werden. Dafür muss für den Betrieb als Applikation von deinem Applet eine Instanz erzeugt werden und die init(), start() etc. auf dieser Instanz aufgerufen werden, was ja sonst der Browser macht.

Falls ich das immer noch falsch verstanden habe: ein jar-File wird so in einer HTML-Seite eingebunden:

```
<applet code="MeineKlasse.class" archive="MeinJar.jar" width=400 heigth=300>
</applet>
```

Ich habe hier mal eine Mini-Anwendung als "Appletcation" gepostet:
http://www.java-forum.org/de/viewtopic.php?p=106814


----------



## HorstHuber (22. Mai 2005)

Wow, danke für die tollen Antworten.

Das Problem ist fast gelöst.

Er zeigt noch ein paar komische Sachen an, aber es kommt der Sache näher.


Entnehme ich Deinem letzen Link und Forenbeitrag richtig, daß ich mein Applet einer Frame-Applikation zufügen soll, daraus ein *.jar Archiv mache und dann quasi die Applikation mit der HTML Seite starte?


----------



## L-ectron-X (22. Mai 2005)

HorstHuber hat gesagt.:
			
		

> Entnehme ich Deinem letzen Link und Forenbeitrag richtig, daß ich mein Applet einer Frame-Applikation zufügen soll, daraus ein *.jar Archiv mache und dann quasi die Applikation mit der HTML Seite starte?



Du schreibst eine Applet-Klasse, die quasi das Haupt-Panel für die Applikation darstellt.
Und du schreibst eine von Frame abgeleitete Klasse, der du die Applet-Klasse als Component hinzufügst.
Beide Klassen packst du in eine signierte, ausführbare jar-datei, deren Main-Class die Applikations-Klasse ist.
Das HTML-File und das jar-File lädst du dann auf den Webserver, womit du im Internet auf einer Webseite ein Applet aufrufen kannst, während die Kopie der jar-Datei auf dem lokalen System als Aplikation per Doppelklick ausgeführt werden kann.

Ansonsten kannst du mal in die FAQ gucken, da habe ich eine Batchdatei gepostet, die dir dein Applet signieren kann:
http://www.java-forum.org/de/viewtopic.php?t=18083


----------

