RMI Fehler: access denied

Status
Nicht offen für weitere Antworten.

heidiweber

Aktives Mitglied
Hallo,

ich habe folgendes Problem bei meinem RMI-Projekt:


Der Server und der Client sind in Eclipse als eigenständige Projekte
angelegt.
Solange sich die beiden Main-Klassen (vom Server und vom Client) - in
ihrem eigenen Projekt(-Ordner) -im selben Package(-Namen) befinden,
funktioniert mein RMI-Projekt.


Wenn ich aber ein Package umbenenne, kommt folgende Fehlermeldung:


Code:
Client exception: java.rmi.UnmarshalException: error unmarshalling 
return; neste 
d exception is: 
        java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no security 
 manager: RMI class loader disabled) 
java.rmi.UnmarshalException: error unmarshalling return; nested 
exception is: 
        java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no security 
 manager: RMI class loader disabled) 
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
        at example.hello1.Client.main(Client.java:21) 
Caused by: java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no secur 
ity manager: RMI class loader disabled) 
        at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source) 
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown 
Source) 
        at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown 
Source) 
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown 
Source) 
        at java.io.ObjectInputStream.readProxyDesc(Unknown Source) 
        at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown 
Source) 
        at java.io.ObjectInputStream.readObject0(Unknown Source) 
        at java.io.ObjectInputStream.readObject(Unknown Source) 
        ... 2 more

Die Fehlermeldung bedeutet doch, dass kein securitymanager vorhanden
ist.


Somit habe ich im Ordner vom Client als auch beim Server die folgende
Datei (client.policy) - direkt auf oberster Ebene im jeweiligen
Projektordner - angelegt:

Code:
grant { 
permission java.net.SocketPermission "192.168.0.2:1099", "connect, 
accept, resolve"; 
permission java.security.AllPermission "", ""; 
};

Um die Datei den SecurityManager zu starten, habe ich dann noch
fogendes ganz am Anfang der Main-Methoden vom Server und vom Client
eingebaut:

Code:
System.setProperty("java.security.policy", "client.policy"); 
if (System.getSecurityManager() == null) 
System.setSecurityManager(new RMISecurityManager());

Ich habe auch gelesen, dass man diese Datei per VM-Argument übergeben
kann. Dies habe ich aber nicht gemacht, da ich denke, dass dieser
Aufruf korrekt ist? Oder liege ich da falsch?


Auf jedenfall bekomme ich jetzt diese Fehlermeldung:

Code:
Client exception: java.security.AccessControlException: access denied 
(java.net. 
SocketPermission 192.168.0.2:1099 connect,resolve) 
java.security.AccessControlException: access denied 
(java.net.SocketPermission 1 
92.168.0.2:1099 connect,resolve) 
        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.checkConnect(Unknown Source) 
        at java.net.Socket.connect(Unknown Source) 
        at java.net.Socket.connect(Unknown Source) 
        at java.net.Socket.<init>(Unknown Source) 
        at java.net.Socket.<init>(Unknown Source) 
        at 
sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S 
ource) 
        at 
sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S 
ource) 
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) 
        at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown 
Source) 
        at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown 
Source) 
        at sun.rmi.server.UnicastRef.newCall(Unknown Source) 
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
        at example.hello1.Client.main(Client.java:26)

Aber ich erlaube doch in der Policy-Datei alles. Oder kann der diese
Datei nicht finden (wie kann man das prüfen)? Oder deutet diese
Fehlermeldung auf was anderes hin?


Vielen lieben Dank
Heidi
 

HoaX

Top Contributor
nein, ganz oben steht:
Code:
Client exception: java.rmi.UnmarshalException: error unmarshalling
er kann ein objekt nicht wieder aus dem stream herstellen - warum?

darum:
Code:
return; neste
d exception is:
        java.lang.ClassNotFoundException: example.hello.RemoteLogin
er findet die klasse example.hello.RemoteLogin nicht
 

heidiweber

Aktives Mitglied
Hallo HoaX,

und was heisst das jetzt?

Die Fehlermeldung tritt am Client auf. Das Package, das da angegeben ist, ist das Interface vom Server, das ich an die Registry binde. Muss ich das im Projekt vom Client einbinden (Glaube ich aber nicht)?

Oder was muss ich machen?
Vielen Dank
cu
Heidi
 

HoaX

Top Contributor
du bekommt vom server ein objekt vom typ example.hello.RemoteLogin zurück, aber der client kennt diese klasse nicht. nimm sie in den classpath mit auf.
 

siassei84

Mitglied
HoaX hat gesagt.:
du bekommt vom server ein objekt vom typ example.hello.RemoteLogin zurück, aber der client kennt diese klasse nicht. nimm sie in den classpath mit auf.
Er muss sie doch nicht kennen. Die Klasse lädt der Client automatisch vom Server und mittlerweile (1.5) könnte der Client auch das Interface vom Server laden.
 

HoaX

Top Contributor
sicher? ich kenn diese probleme halt von meiner j2ee anwendung ... hast du n link wo man das nachlesen kann?
 

heidiweber

Aktives Mitglied
Hallo,

ich habe mal mein Projekt hier als ZIP-File geuppt:

http://people.freenet.de/myjava/HeidiJava.zip

Es sind 2 JAR-Files - einmal der Server und einmal der Client.

Beide sind so lauffähig.

Sobald ich den Client so aufrufe (in Eclipse als VmArgument):
-Djava.security.policy=javapolicy1

Beim Server so:
-Djava.security.policy=javapolicy

Und dann den SecurityManager im Code aktiviere - ist jetzt ausgesternt - kommt die Fehlermeldung:

Code:
Client exception: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
	at java.security.AccessController.checkPermission(AccessController.java:427)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
	at java.net.Socket.connect(Socket.java:513)
	at java.net.Socket.connect(Socket.java:469)
	at java.net.Socket.<init>(Socket.java:366)
	at java.net.Socket.<init>(Socket.java:179)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
	at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at example.hello.Client.main(Client.java:21)

Was mache ich da falsch? Binde ich das falsche Objekt an die Registry? Ich weiß echt nicht mehr weiter...
Wäre super, wenn mir helfen könntest:)


Vielen lieben Dank
cu
Heidi
 

HoaX

Top Contributor
is ja schön das du uns das projekt zeigst, aber ohne sourcecode bringt uns das nicht viel ...
 
G

Guest

Gast
Fangen wir mal damit an, dass das hier Quatsch ist.
Code:
grant { 
permission java.net.SocketPermission "192.168.0.2:1099", "connect, 
accept, resolve"; 
permission java.security.AllPermission "", "";
}
Wenn du schon alles zulassen willst, dann wie folgt. Den Rest kannst du dir sparen.
Code:
grant { 
   permission java.security.AllPermission; 
}
 

heidiweber

Aktives Mitglied
Vielen Dank euch allen

Ich kann es gar nicht glauben - aber so wies aussieht, funktionierts :)

Ich werde mich am Montag wg. der genauen Lösung nochmals melden.

Wünsche euch allen eine schöne Nacht mit den Smashing Pumpkins

Bis Montag

cu
Heidi
 

heidiweber

Aktives Mitglied
Hallo,

ich möchte noch kurz erklären an was das gelegen hat (bzw. das was ich denke):

Der folgende VM-Parameter hat viel geholfen:
-Djava.security.debug="policy,jar,scl,access,failure"

Er konnte die Policy-Datei nicht finden, da ich die einmal als VM-Argument übergeben habe (der richtige Pfad). Dann hatte ich im Code noch:
System.setProperty("java.security.policy", "clients.policy");

Aber die Policy-Datei heisst: client.policy

Erschlagt mich bitte nicht. Ich habe das "s" echt nicht gesehen....

Da ich den Server und den CLient in unterschiedlichen Projekten, mit unterschiedlichen Packages, habe, kam dann die Meldung:

Code:
Client exception: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at example.hello.Client.main(Client.java:25)
Caused by: java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
	at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
	at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
Ich habe dann herausgefunden, dass die Packages, indem sich die Interfaces befinden, den gleichen Package-Namen haben müssen. --> Kann mir vielleicht noch jemand erklären, warum das so ist (Classloader??) ?

Aber jetzt läufts endlich...
VIelen Dank noch an euch allen für die Hilfe

Einen schönen (Feier-)Tag, falls ihr heute frei habt.
Liebe Grüße
Heidi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
X Netty TLS Authentifizierung Fehler Netzwerkprogrammierung 1
OnDemand API Aufruf besser steuern, wie Fehler vermeiden Netzwerkprogrammierung 20
V Ich finde den Fehler nicht... Netzwerkprogrammierung 2
A sporadischer Fehler beim Schreiben auf NAS Netzwerkprogrammierung 2
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
F HTTP Website parsen Fehler 403 Netzwerkprogrammierung 2
M Socket Verschlüsselte Kommunikation - Fehler Netzwerkprogrammierung 1
M Wo ist mein Fehler ? o: Netzwerkprogrammierung 4
D Komischer Fehler Readline() Netzwerkprogrammierung 7
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
B RMI & Mysql -> Fehler bei der Compilierung Netzwerkprogrammierung 4
C Fehler bei PDF-Download Netzwerkprogrammierung 5
M ActiveMQ Anfänger-Fehler Netzwerkprogrammierung 3
N Socket Fehler bei Streams Netzwerkprogrammierung 2
F Socket ImageIcon über Socket --> Fehler Netzwerkprogrammierung 14
M chat als applet umgeschrieben - unbekannter fehler :( Netzwerkprogrammierung 2
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
L NullPointerException...finde den Fehler nicht Netzwerkprogrammierung 10
E einfache Frage: wie Fehler untersuchen mit Tomcat Netzwerkprogrammierung 5
R Fehler bei RMI in Verbidung mit JDBC Netzwerkprogrammierung 6
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
R Server - Client - Fehler? Netzwerkprogrammierung 3
M SOAP Messaging Fehler Netzwerkprogrammierung 10
J RMI Fehler beim Proxy Netzwerkprogrammierung 2
B Fehler 401 bei http GET Netzwerkprogrammierung 2
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2
C irc client: Fehler 451 Netzwerkprogrammierung 12
G Heimnetzwerkchatprogramm: Fehler im Code Netzwerkprogrammierung 11
J access denied (“java.net.SocketPermission”…) mit Java 8 Netzwerkprogrammierung 1
N Applet Access Denied Netzwerkprogrammierung 12
J Applet Security - java.security.AccessControlException: access denied Netzwerkprogrammierung 3
A RMI - access denied Netzwerkprogrammierung 2
G Applet java.net: acces denied Netzwerkprogrammierung 2
Paule Acces denied bei Chat Netzwerkprogrammierung 6

Ähnliche Java Themen


Oben