24. oktober 2001 - 22:23Der er
10 kommentarer og 1 løsning
RMIClassLoader problem
Hejsa, jeg har sat en ny SecurityManager gennem System og forsøger nu at downloade en stub via en url - til dette formål gør jeg brug af loadClass i RMIClassLoader-klassen, men jeg får en eller anden UnMarshallException der fortæller mig at klassen ikke kan lokaliseres og det på trods af at jeg bruger localhost. Det er noget lort, hvorfor kan jeg ikke downloade min stub?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Spørgsmål? Du bruger selvfølgelig en RMISecurityManager istedet, men starter du også programmet med: java -Drmi.server.codebase=file:/C:\\temp\\classes ... Hvor codebase er tilpasset dit system?
Jeg er íkke nået så langt som at køre programmet med codebase, så jeg vender lige tilbage når jeg har forsøgt mig med RMISecurityManager og codebase. Men hvad er det der ligger i C:\\temp ?? er det policy-filen?
Jeg kunne godt poste kode, men altså det eneste problem er at den ikke vil downloade klassen via classloaderen, jeg må lige lidt dybere ind i det
Perfekt. Jeg må sige, jeg havde overovedet ikke tænkt på at \'udnytte\' sun noget mere efter jeg startede med at rode med rmi. Jeg vil lige læse det igennem og så give point efterfølgende. ok?
Mine settings er som følger Filer der ligger i C:\\Server ServerFil (fil der implementerer interface og extender UnicastRemoteObject) Policyfil (hedder policy.txt) interface (extender java.rmi.remote) stub-klasse (lavet ud fra ServerFil.class) skel-klasse (lavet ud fra ServerFil.class)
Filer der ligger i C:\\Client ClientFil PolicyFil
Der ligger ingen stub-filer eller interface filer i C:\\Client, det er meningen at jeg vil være istand til at downloade disse via localhost også en eller anden default port.
Jeg har compilet alle client/server filer uden problemer Jeg starter RMIRegistry Jeg starter Serveren og den venter nu på en client
Jeg starter Clienten, men .... jeg får en eller anden Exception der fortæller mig at der ikke kan etableres en forbindelse til 127.0.0.1:1099 eller noget i den retning.
Jeg kører server filen med flg text: C:\\jdk1.3\\bin\\java.exe -Djava.rmi.server.codebase=file:/C:\\Server/-Djava.rmi.server.hostname=localhost -Djava.security.policy=policy.txt \"%n\"
og klient filen med flg text: C:\\jdk1.3\\bin\\java.exe -Djava.rmi.server.codebase=file:/C:\\Client/-Djava.security.policy=policy.txt \"%n\" localhost 20
Det er det sædvanlige problem med policies og properties, men lad mig fortælle, hvad jeg gjorde:
Jeg pakkede det ud hos mig (C:\\temp\\rmi) i bibliotek henholdsvis Server og Client
Gik ned i Server og rettede policy filen til (Kun socket permissions er nødvendig for at binde en server): grant { permission java.net.SocketPermission \"*:1024-65535\", \"connect, accept\"; }; Startede rmiregistry (Husk rmiregistry skal kunne finde stubklasse, f.eks. via classpath) Startede serveren: java -Djava.security.policy=policy.txt RMIServer
Kiggede på klienten.
klienten startes med java -Djava.rmi.server.codebase=file:///C:\\temp\\rmi\\Server\\ -Djava.security.policy=policy.txt RMIClient
Hvor codebase = URL, hvor jeg kan download stub koden fra policy = nødvendige policies til at tilgå binding og codebase
Da codebase er en file url, skulle jeg således have socketpermission (til naming) og filepermission til min file url. grant { permission java.net.socketPermission \"*:1024-65535\", \"connect, accept\"; permission java.io.FilePermission \"C:\\\\temp\\\\rmi\\\\Server\\\\-\", \"read\"; };
Og så kørte det.
Jeg brugte dog lidt tid, fordi jeg kom til at editere i serverens policy fil, da jeg troede jeg rettede klientens policy fil fordi de begge to hedder policy.txt. Gør mig den tjeneste at kalde dem f.eks. server.policy og client.policy. Det gør det noget nemmere at finde rundt i :-)
Jeg kunne se ud fra dine kommentarer, at du har prøvet lidt af hver :-) Pas på med den engang imellem..
Og som afsluttende bemærkning. Hvis du senere skal sende remote objekter til serveren, skal serveren selvfølgelig kunne loade de stubbe den anden vej, så der tilføjer du selvfølgelig det spejlede scenario.
Det er faktisk ret vigtigt at rmiregistry IKKE kan finde klasserne, da den så overrider codebase. Det er i codebase man skal angive stien til class filerne. Det virker fint så længe server og klient kører på samme maskine, men hvis du på et tidspunkt gerne vil have dem til at køre på to forskellige maskiner vil codebase typisk være en http URL, og så er det upraktisk at codebase insisterer på at det er c:\\server. når man starter rmiregistry må filerne altså ikke være at finde i classpath, og hvis man starter rmiregistry fra en kommandoprompt må du ikke starte den et sted hvor den kan finde filerne. Feks mens du står i c:\\server. På det punkt var det altså rigtigt nok det backupmand gjorde :o)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.