Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

rmi ClassLoader 2

0 views
Skip to first unread message

paolog

unread,
Mar 3, 2003, 10:20:41 AM3/3/03
to
Ciao a tutti,
sono costretto a riprendere in mano il post di qualche giorno fa: credevo di aver
risolto invece....
Avevo scritto:
Ho trovato un' interessante funzione in java che sto cercando di approfondire:
il caricamento dinamico delle classi.
Ho trovato del codice d'esempio però non riesco a farlo girare sulla mia macchina.
Quello che interessa a me è creare un piccolo caricatore da mettere sul
client (rete locale) e tenere il resto dell' applicativo sul server.
Questo è parte dell' esempio che sto studiando:

public class BootstrapClient {
public static void main(String args[]) {
System.setSecurityManager(new RMISecurityManager());
Frame cf = new CloseableFrame("NetworkApp");
cf.show();

try {
URL url = new
----> URL("http://200.200.15.2//home/paolos/eclipse/workspace/rmiserver/");
Class cl = RMIClassLoader.loadClass(url,"serverapp.NetworkApp");
Class argTypes[] = {Class.forName("java.awt.Frame")};
Object argArray[] = {cf};
Constructor cntr = cl.getConstructor(argTypes);
Runnable client = (Runnable)cntr.newInstance(argArray);
client.run();
} catch (Exception e) {
e.printStackTrace();
}
}

La riga in cui mi 'impantano' è quella in cui si da l'Url del applicazione
server. E' giusto quello che ho scritto? nel senso che il computer dove si
trova l'applicazione si chiama lserver ed il percorso è :
/home/paolos/eclipse/workspace/rmiserver/
l' applicazione è: serverapp.NetworkApp
L' errore di ritorno è:

java.lang.ClassNotFoundException: access to class loader denied
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:421)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:159)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:169)
at BootstrapClient.main(BootstrapClient.java:21)
Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission 200.200.15.2:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
at sun.rmi.server.LoaderHandler$Loader.checkPermissions(LoaderHandler.java:1128)
at sun.rmi.server.LoaderHandler$Loader.access$000(LoaderHandler.java:1082)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:385)
... 4 more

Praticamente se la classe 'server' è sulla stessa cartella o al massimo
sottocartella di quella 'client' (BootstrapClient.java),
riesco ad usarla altrimenti mi ritorna l' errore di cui sopra.
Ho pensato che fosse un probliema di sicurezza; ma se così fosse come ne esco?

Se qualcuno può aiutarmi.....

Salvatore Iovene

unread,
Mar 4, 2003, 5:36:19 AM3/4/03
to
Sě, sono abbastanza sicuro che si tratti di un problema di sicurezza... ti
manca il permesso di accesso al socket. Per averlo devi creare un file di
policy (ad esempio chiamalo policy.txt) e scriverci dentro:

grant {
permission java.net.SocketPermission "*:1024-65535", "accept, connect,
listen";
};

poi esegui il programma usanda l'opzione
-Djava.security.policy=policy.txt

ciao!

"paolog" <paol...@libero.it> ha scritto nel messaggio
news:dpK8a.173467$ZE.51...@twister2.libero.it...


> Ciao a tutti,
> sono costretto a riprendere in mano il post di qualche giorno fa: credevo
di aver
> risolto invece....
> Avevo scritto:
> Ho trovato un' interessante funzione in java che sto cercando di
approfondire:
> il caricamento dinamico delle classi.

> Ho trovato del codice d'esempio perň non riesco a farlo girare sulla mia
macchina.
> Quello che interessa a me č creare un piccolo caricatore da mettere sul


> client (rete locale) e tenere il resto dell' applicativo sul server.

> Questo č parte dell' esempio che sto studiando:


>
> public class BootstrapClient {
> public static void main(String args[]) {
> System.setSecurityManager(new RMISecurityManager());
> Frame cf = new CloseableFrame("NetworkApp");
> cf.show();
>
> try {
> URL url = new
> ---->
URL("http://200.200.15.2//home/paolos/eclipse/workspace/rmiserver/");
> Class cl = RMIClassLoader.loadClass(url,"serverapp.NetworkApp");
> Class argTypes[] = {Class.forName("java.awt.Frame")};
> Object argArray[] = {cf};
> Constructor cntr = cl.getConstructor(argTypes);
> Runnable client = (Runnable)cntr.newInstance(argArray);
> client.run();
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
>

> La riga in cui mi 'impantano' č quella in cui si da l'Url del applicazione


> server. E' giusto quello che ho scritto? nel senso che il computer dove si

> trova l'applicazione si chiama lserver ed il percorso č :
> /home/paolos/eclipse/workspace/rmiserver/
> l' applicazione č: serverapp.NetworkApp
> L' errore di ritorno č:


>
> java.lang.ClassNotFoundException: access to class loader denied
> at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:421)
> at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:159)
> at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
> at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:169)
> at BootstrapClient.main(BootstrapClient.java:21)
> Caused by: java.security.AccessControlException: access denied
(java.net.SocketPermission 200.200.15.2:80 connect,resolve)
> at
java.security.AccessControlContext.checkPermission(AccessControlContext.java
:270)
> at
java.security.AccessController.checkPermission(AccessController.java:401)
> at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
> at
sun.rmi.server.LoaderHandler$Loader.checkPermissions(LoaderHandler.java:1128
)
> at sun.rmi.server.LoaderHandler$Loader.access$000(LoaderHandler.java:1082)
> at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:385)
> ... 4 more
>

> Praticamente se la classe 'server' č sulla stessa cartella o al massimo


> sottocartella di quella 'client' (BootstrapClient.java),
> riesco ad usarla altrimenti mi ritorna l' errore di cui sopra.

> Ho pensato che fosse un probliema di sicurezza; ma se cosě fosse come ne
esco?
>
> Se qualcuno puň aiutarmi.....


paolog

unread,
Mar 5, 2003, 2:46:57 PM3/5/03
to
> grant {
> permission java.net.SocketPermission "*:1024-65535", "accept, connect,
> listen";
> };
>
> poi esegui il programma usanda l'opzione
> -Djava.security.policy=policy.txt
>

Ciao,
ti ringrazio per la risposta, ho provato a fare come dicevi, ho cercato di
eseguire alla lettera
però ancora non mi funziona. Ha cercato di documentarmi in merito alla sicurezza
però non ho trovato molto di più di
quello che tu mi hai consigliato.

Questa è la riga per il lancio del prg
[paolos@lserver rmi]$ java -Djava.security.policy=policy.txt BootstrapClient

Questo è il nuovo output:
java.security.policy: errore nellanalisi di {0}:
{1}


java.lang.ClassNotFoundException: access to class loader denied
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:421)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:159)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:169)

at BootstrapClient.main(BootstrapClient.java:26)


Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission 200.200.15.2:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
at sun.rmi.server.LoaderHandler$Loader.checkPermissions(LoaderHandler.java:1128)
at sun.rmi.server.LoaderHandler$Loader.access$000(LoaderHandler.java:1082)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:385)
... 4 more

il file policy.txt è nella stessa cartella di BootstrapClient.
Se hai qualche altro suggerimento non può che farmi piacere.
Ti ringrazio

0 new messages