2017-11-17 8 views
1

私はRMIアプリケーションを構築していますが、次のサーバークラスがあります。しかし、Eclipseで実行すると、次の例外が発生します。何が間違っていて、どうすれば修正できますか?私は過去2日間、オンラインで同様の問題について読んだが、解決策を見つけることができなかった。ポリシーファイルとは関係があると思われますが、どのように使用するかはわかりません。また、問題が私がそれを実行する方法である場合は、あなたは私に日食でそうするための指示を与えてくださいできます。RMIサーバーjava.security.AccessControlException:アクセスが拒否されました

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) 

答えて

2

それは非常に簡単です。

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

は、ポリシーファイルが許可

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

または何が正しい構文はを付与しなければならないことを意味します。それを正しくするにはpolicytoolを使用してください。ポート番号をワイルドカードすることができます。また、システム・プロパティjava.security.policyを介してポリシー・ファイルの場所を指定する必要があります。また、テストのように他のアクセス制御例外を取得した場合は、同様に、クロージャまで対応するアクセス許可を追加する必要があります。

しかし、なぜセキュリティマネージャを使用しているのかというと尋ねます。非常にまれなコードベース機能を使用しない限り必須ではありません。クライアントからクラスをアップロードするためにコードベース機能を使用する場合を除き、サーバでは必要ありません。希少。

関連する問題