2017-11-17 2 views
1

Ich baue eine RMI-Anwendung und ich habe die folgende Server-Klasse. Wenn ich es jedoch in Eclipse starte, erhalte ich die folgende Ausnahme. Was ist falsch und wie kann ich es beheben? Ich habe die letzten 2 Tage über ähnliche Probleme online gelesen, aber ich konnte die Lösung nicht finden. Ich vermute, dass es etwas mit einer Richtliniendatei zu tun hat, aber ich habe keine Ahnung, wie man eine verwendet. Auch wenn das Problem mit der Art und Weise ist, wie ich es ausführe, kannst du mir bitte eine Wegbeschreibung geben, damit du es in Eclipse machst.RMI-Server java.security.AccessControlException: Zugriff verweigert

import java.rmi.RemoteException; 
import java.rmi.RMISecurityManager; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 
import javax.rmi.ssl.SslRMIClientSocketFactory; 
import javax.rmi.ssl.SslRMIServerSocketFactory; 


public class MyServer extends UnicastRemoteObject implements Interface { 

    private static final int PORT = 2019; 

    public MyServer() throws Exception { 
     super(PORT, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory()); 
    } 

    public static void main(String args[]) { 


     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new RMISecurityManager()); 
     } 

     try { 

      Registry registry = LocateRegistry.createRegistry(PORT, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory()); 

      MyServer obj = new MyServer(); 


      registry.bind("HelloServer", obj); 

     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void sayHello() throws RemoteException { 
     System.out.println("Hello"); 
    } 
} 

-

access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve") 
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:2019" "listen,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.checkListen(Unknown Source) 
    at java.net.ServerSocket.bind(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 
    at javax.rmi.ssl.SslRMIServerSocketFactory$1.<init>(Unknown Source) 
    at javax.rmi.ssl.SslRMIServerSocketFactory.createServerSocket(Unknown Source) 
    at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.listen(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source) 
    at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source) 
    at sun.rmi.transport.LiveRef.exportObject(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source) 
    at sun.rmi.registry.RegistryImpl.setup(Unknown Source) 
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source) 
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source) 
    at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source) 
    at MyServer.main(MyServer.java:27) 

Antwort

2

Es ist sehr einfach.

access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve") 

bedeutet, dass die Richtliniendatei die Erlaubnis

java.net.SocketPermission "localhost:2019", "listen,resolve" 

oder was auch immer die korrekte Syntax ist zu erteilen hat. Verwenden Sie die policytool, um es richtig zu machen. Möglicherweise möchten Sie die Portnummer mit einem Platzhalter versehen. Außerdem müssen Sie den Speicherort der Richtliniendatei über die Systemeigenschaft java.security.policy angeben. Und wenn Sie wie beim Testen andere Zugriffskontrollausnahmen erhalten, müssen Sie ebenfalls die entsprechenden Berechtigungen bis zum Schließen hinzufügen.

Aber ich würde lieber fragen, warum Sie überhaupt einen Sicherheitsmanager verwenden. Es ist nicht notwendig, es sei denn, Sie verwenden die Codebase-Funktion, die ziemlich selten ist, und es ist nicht notwendig auf einem Server, wenn Sie die Codebasis-Funktion verwenden, um Klassen vom Client hochzuladen, was viel ist seltener.

Verwandte Themen