Frage

Hey, ich bin einen AccessControlException: access denied bekommen, wenn Sie versuchen, ein RMI-App zu starten ich schreibe, kann ich Sie nicht arbeiten, warum ich diese Ausnahme, wenn ich es auf dem Standard-Port 1099 öffnen, oder auf einem anderen dynamisch Port, meine Richtliniendatei zur Zeit gewährt alles (ändert sich, wenn App fertig ist).

Ich steckt, wo es schief läuft, jede Hilfe von großem Nutzen sein würde

Mein Code

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
     if (System.getSecurityManager() == null)
     {
        System.setSecurityManager ( new RMISecurityManager() );
     }

     CreditCardServer ccs = new CreditCardServer();

     int port = 1099;

     try {
        port = Integer.valueOf(args[0]);
        }
     catch (Exception e)
        {
        System.out.println("Invlaid Port");
        }

     if (((port <= 65535) && (port >= 49152)) || port ==1099)
     {
     System.out.println("Valid Port");
     }
     else
     {
         port = 1099;
        System.out.println("Port not in Dynamic Range 49152<-->65535");
     }

     System.out.println(port);

     LocateRegistry.createRegistry(port);

     LocateRegistry.getRegistry().bind("CreditCardServer", ccs);

     while (true)
     {
        //hum?
     }
}

}

Der Stack-Trace

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

Gültige Port

65000

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
        at java.security.AccessController.checkPermission(AccessController.java:553)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
        at java.net.Socket.connect(Socket.java:536)
        at java.net.Socket.connect(Socket.java:492)
        at java.net.Socket.<init>(Socket.java:389)
        at java.net.Socket.<init>(Socket.java:203)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at bookstorecreditcardserver.Main.main(Main.java:56)

Meine Policy-Datei

grant {
// Allow everything for now
permission java.security.AllPermission;
};
War es hilfreich?

Lösung 2

Im Grunde genommen, ich bin dumm, ich angenommen, dass, weil Java nicht beschwert wurde die .policy Datei AOK zu finden, stellt sich heraus, es nicht eine neue Kopie der the.policy-Datei in das Arbeitsverzeichnis bewegte löst alle :-D

Andere Tipps

Ich habe auf diesem ganzen Tag steckt (nach herauszufinden, ich hatte das rmiregistry von der Kommandozeile zu starten), diese Arbeit vor Ort mit Eclipse zu machen versucht, und es schließlich gelöst. Ein paar Hinweise andere dieses grausame Schicksal zu bewahren:

1 - ordnen Sie die Richtliniendatei korrekt, entweder mit einer Kommandozeilen-Flagge:

java -Djava.security.policy=/home/.../<filename>.policy ...

oder durch diese direkt im Code setzen:

System.setProperty("java.security.policy","file:///home/.../<filename>.policy");

Sie können es auch im selben Ordner wie der Projektstamm setzen), die URI

zu reduzieren
file:./<filename>.policy

(verwenden Sie eine relative statt absolute URI - Ich verstand eigentlich nicht diese bis heute)

.

2 - stellen Sie sicher, dass das Format der Richtliniendatei korrekt ist, z.

grant codeBase "file:<path>/bin/-" {
    permission java.security.AllPermission;
};

Diese auf den Ordner verweisen sollte, wo die Binärdatei befindet! Eine ausführliche Erklärung des Formats der Richtliniendatei hier .

Das ist es, ich auch dieses Tutorial empfehlen würde, ich fand es sehr hilfreich, auf dem richtigen Weg zu erhalten.

fand ich die meisten Antworten zu diesem Thema vage und wenig hilfreich, und verbrachte mehrere Stunden des Debuggen. Mehr als wahrscheinlich, Ihr Fehler ist, weil die Richtliniendatei entweder falsch formatiert ist, oder du bist nicht richtig es als Befehlszeilenargument zu setzen.

Wenn Sie immer ein java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. Erstellen Sie eine Sicherheitsrichtliniendatei mit allen Berechtigungen, nur um es zu testen

grant codeBase "file:/-" { permission java.security.AllPermission; };

  1. Mit dieser Sicherheitsdatei für den Client und den Server, nur um es ausgeführt wird.

  2. Stellen Sie sicher, dass Sie keine Fehler haben. Ich verbrachte Stunden, um herauszufinden, warum es nicht funktioniert, und ich hatte getippt -Djava.rmi.security.policy anstelle von -Djava.security.policy = ...

Für diejenigen von uns, die wollen einfach nur die RMI-Tutorial von Oracle zu bekommen und läuft, diese Sicherheitspolitik wird mehr als genug sein für das Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top