# .class variabel laden



## Killi138 (9. Feb 2006)

Hi Leute, ich hoffe ihr könnt mir helfen!

Ich habe ein Java Applet...nun greifen ein paar Kunden auf eine URL auf meinem Server zu, hier steht der applet-code:



```
<applet code="http://www.domain.de/getClass.php?kid=123" archive="golden_0_2_3.jar" width="740" height="417">
</applet>
```


das golden_0_2_3.jar ist meine Golden Game Engine, diese tut nichts zur Sache.

Ich will nun, dass mir die PHP-Datei die gewünschte .class zurückgibt.....denn der Kunde mit der id 12 will eine Einzelspielerversion und der Kunde mit der id 123 will Mehrspielerversion mit seiner eigenen Werbung....

Versteht ihr was ich meine?



Wie bekomme ich das hin?

Habe schon ewig am PHP-Script rumgetüftelt, nichts hilft....



Wenn ich wirklich nur


```
<?php
   if ($id == 12) {
     header("Location: ping/Ping1.class");
   }
   else if ($id == 123) {
      header("Location: ping/Ping2.class");
   }
?>
```


als getClass.php habe, dann gibt es mir eine NullPointerException dass die Klasse domain.de.getClass.php nicht geöffnet werden konnte!
Rufe ich die Datei allerdings direkt im Browser auf, gibt sie mir die class zurück....


....was tun???


----------



## Bleiglanz (9. Feb 2006)

is doch völliger Quatsch was du machst

im code Attribut steht TEXT


```
<applet code="<?php
   if ($id == 12) {
     echo("ping.Ping1.class");
   }
   else if ($id == 123) {
      echo("ping.Ping2.class");
   } 

?>" archive="golden_0_2_3.jar" width="740" height="417">
</applet>
```
denk mal drüber nach


----------



## Killi138 (9. Feb 2006)

Hab ich doch versucht!!!

Wenn ich in der PHP nur schreibe:


```
<?php
   echo "ping/Ping.class";
?>
```

bekomm ich TROTZDEM folgende Meldungen (auch wenn ich in der PHP header('Content-type: text'); setze!!!):



Laden: Klasse http://www.killinger-it.com/files/testphp/test.php nicht gefunden
java.lang.ClassNotFoundException: http:..www.killinger-it.com.files.testphp.test.php
	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 sun.applet.AppletClassLoader.loadCode(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)
Caused by: java.io.IOException: open HTTP connection failed.
	at sun.applet.AppletClassLoader.getBytes(Unknown Source)
	at sun.applet.AppletClassLoader.access$100(Unknown Source)
	at sun.applet.AppletClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 10 more
Exception in thread "Thread-4" java.lang.NullPointerException
	at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
	at sun.plugin.AppletViewer.showAppletException(Unknown Source)
	at sun.applet.AppletPanel.runLoader(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
	at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
	at sun.plugin.AppletViewer.showAppletStatus(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Exception in thread "thread applet-http://www.killinger-it.com/files/testphp/test.php" java.lang.NullPointerException
	at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
	at sun.plugin.AppletViewer.showAppletException(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


----------



## Campino (9. Feb 2006)

Nein, kannst denn Code nicht über die html-Datei senden sondern musst in das Attribute den Namen der Klasse schreiben, die du brauchst. Du musst also mit einer php-if-Abfrage feststellen für welches Applet du den Tag brauchst...


----------



## Bleiglanz (10. Feb 2006)

Killi138 hat gesagt.:
			
		

> Hab ich doch versucht!!!
> 
> Wenn ich in der PHP nur schreibe:
> 
> ...


Du sollst das nicht in einer externen Datei schreiben 

sondern 

IM APPLET TAG

ODER

dein php-skript ist so programmiert, dass es den Byte-Code der entprechenden Java Klasse zurückschickt


----------



## Gast (10. Feb 2006)

> ...sondern musst in das Attribute den Namen der Klasse schreiben, die du brauchst...



Das hab ich ja mit echo "ping/ping.class"; versucht...


@Bleiglanz:

Ich muss eine externe PHP verwenden!
Wenn du nun sagst ich muss die PHP so schreiben dass es den Bytecode zurückgibt frage ich mich auch was ich falsch gemacht habe!
Das habe ich mit


```
$fp = fopen("ping/Ping.class", "r");
echo fread($fp, filesize("ping/Ping.class"));
fclose($fp);
```

auch schon versucht!



Meine Ordner sind so strukturiert:

meinedomain.com/files/testphp <- hier liegt die test.php, die die Class bekannt geben soll
meinedomain.com/files/ping/index.html <- diese hier gibt im Applet Code die PHP an...

...wenn ich den Bytecode auslese und zurückgebe, wie soll dann der Header aussehen? Einfacher Text, oder application, oder...!?

Was mache ich falsch?
Er meldet immer die Fehlermeldung java.lang.ClassNotFoundException: http:..www.killinger-it.com.files.testphp.test.php


----------



## AlArenal (10. Feb 2006)

Gast hat gesagt.:
			
		

> > ...sondern musst in das Attribute den Namen der Klasse schreiben, die du brauchst...
> 
> 
> 
> Das hab ich ja mit echo "ping/ping.class"; versucht...



Das ist ein Dateiname, kein Klassenname...
Die Klasse muss zudem in dem vom Applet verwendeten JAR-Archiv an der über den Klassennamen evtl. näher bezeichneten Ort (Paket-Pfad) vorhanden sein.


----------



## Bleiglanz (10. Feb 2006)

> Das habe ich mit
> 
> $fp = fopen("ping/Ping.class", "r");
> echo fread($fp, filesize("ping/Ping.class"));
> ...


das ist bullshit, weil du binärdaten als text zurückschickst, das kann nicht gehen


----------



## Guest (10. Feb 2006)

Bleiglanz hat gesagt.:
			
		

> das ist bullshit, weil du binärdaten als text zurückschickst, das kann nicht gehen





Deshalb habe ich ja gefragt welchen Header ich denn nehmen soll.....


----------



## AlArenal (10. Feb 2006)

Anonymous hat gesagt.:
			
		

> Bleiglanz hat gesagt.:
> 
> 
> 
> ...



Gar keinen, weil da ein String reingehört, der der Klassenname ist (evtl. mit Paket-Pfad) und kein Binärkram. Du kannst keine richtige Antwort auf ne falsche Frage erwarten.


----------



## Bleiglanz (10. Feb 2006)

vergiss den echo befehl...

application/java

ist der MIME-Type


----------



## AlArenal (10. Feb 2006)

Bleiglanz hat gesagt.:
			
		

> vergiss den echo befehl...
> 
> application/java
> 
> ist der MIME-Type



Ja, aber soll ihm das bringen?


----------



## Killi138 (10. Feb 2006)

AlArenal hat gesagt.:
			
		

> Gar keinen, weil da ein String reingehört, der der Klassenname ist (evtl. mit Paket-Pfad) und kein Binärkram. Du kannst keine richtige Antwort auf ne falsche Frage erwarten.




Mann, Mann, Mann....hab ich doch schon versucht - wenn ich "Ping.class" ausgebe, kommt TROTZDEM die Exception, die besagt dass die Klasse file.irgendwas.datei.php nicht gefunden wurde!
Also die Pfadangabe zur PHP, allerdings die "/" durch "." ersetzt! Und das soll er ja gerade nicht machen!


----------



## Killi138 (10. Feb 2006)

So - habs jetzt mit application/java probiert und die Ping.class ausgelesen und zurückgegeben....

Fehlermeldungen:


```
Laden: Klasse [url]http://www.killinger-it.com/files/testphp/test.php[/url] nicht gefunden
java.lang.ClassNotFoundException: http:..[url]www.killinger-it.com.files.testphp.test.php[/url]
	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 sun.applet.AppletClassLoader.loadCode(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)
Caused by: java.io.IOException: open HTTP connection failed.
	at sun.applet.AppletClassLoader.getBytes(Unknown Source)
	at sun.applet.AppletClassLoader.access$100(Unknown Source)
	at sun.applet.AppletClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 10 more
```

--> wieso sagt er denn immer, dass die www.killinger-it.com.files.testphp.test.php Klasse nicht gefunden wurde??
Ich gebe ihm ja diesmal wirklich die Binärdaten zurück...

..jemand ne Idee?


----------



## AlArenal (10. Feb 2006)

Ich gebs auf 

Trag hartverdrahtet ein, was deiner Meinung nach da stehen muss, so lange bis es funzt. Und dann schriebste dir ein Skript, das diese erforderliche Ausgabe produziert und setzt es da ein.

Es baut auch keiner gleich ein ganzes Auto, ohne jamals zuvor getestet zu haben, ob der Motor geht...


----------



## Killi138 (10. Feb 2006)

So - perfekt...hab das Ganze jetzt ganz anders gelöst!

Is zwar irgendwie drumrum programmiert, aber es tut!

--- Datei index.html: ---

Hat eine JavaScript -Datei includiert (src="http://www......test.php" - wichtig ist das .php!)
Ruft im body-Bereich die JavaScript-Funktion getClass() auf...


--- Datei test.php ---
erstellt einfach eine Java-Script funktion, die den ganzen Applet-Code zurück gibt

...so!

Man sieht also im Quelltext nur noch die getClass() Funktion, sonst nix!
Diese baut den Applet-Code auf un mein Spiel erscheint  *yippii*

wenn ich die php Datei nun so umbaue, dass eine KundenID mit übergeben wird, kann ich in dieser dann prüfen OB und wenn ja, welche Version der Kunde hat und kann daraufhin die richtige zurückgeben.

Ein weiterer Vorteil ist, dass ich die aufrufende URL prüfen und vergleichen kann...wenn diese nicht gleich der URL ist, die zur KundenID gehört, dann macht mein PHP einfach gar nix!

So sieht jemand auch nicht gleich wo denn die .class auf meinem Server liegt 
Das war der einzige Grund aus dem ich das brauche!

Trotzdem danke für alles!


----------



## AlArenal (10. Feb 2006)

Killi138 hat gesagt.:
			
		

> So sieht jemand auch nicht gleich wo denn die .class auf meinem Server liegt
> Das war der einzige Grund aus dem ich das brauche!
> 
> Trotzdem danke für alles!



Applet mit passendem Parameter starten - Applet lädt dynmisch Klasse nach - Applet benutzt Klasse - aus die Maus...


----------



## Bleiglanz (10. Feb 2006)

> Das war der einzige Grund aus dem ich das brauche!


Deine Methode dürfte selbst AnfängerHacker doch glatt 2 Minuten aufhalten - gratuliere


----------



## Guest (10. Feb 2006)

Bleiglanz hat gesagt.:
			
		

> Deine Methode dürfte selbst AnfängerHacker doch glatt 2 Minuten aufhalten - gratuliere



wegen? Wie kommt man trotzdem ran?
Ja meine Güte...ich wollte eben nicht dass man den Dateipfad sieht...


----------



## AlArenal (10. Feb 2006)

Anonymous hat gesagt.:
			
		

> Bleiglanz hat gesagt.:
> 
> 
> 
> ...



Im Zweifelsfalle kommt man immer ran, so lange man die Datei für alle zugänglich (öffentlich) auf nem Webserver liegen hat. Das ist nun wirklich kein Akt.


----------



## Gast (10. Feb 2006)

Es wäre doch eine gute Lösung, wenn es die Datei gar nicht geben würde...wenn ich dann auf meinem Server eine 404 Seite in PHP erstelle, die dann prüft ob der gewünschte Dateiname der meines Spiels war und dann den richtigen Code aus einer ganz anderen Quelle zurückgibt...


----------



## Bleiglanz (10. Feb 2006)

mit javascript kann man eben gar nichts verstecken!

und die Dateien eines Applets müssen eben öffentlich zugänglich sein, sonst kann sie sich der Browser ja nicht holen -> da führt kein Weg dran vorbei

allerdings kannst du die Streaming Lösung zusammen mit HTTP Sessions verwenden, und die class Datei nur nach vorherigem Login zugänglich machen...


----------

