2017-11-17 25 views
1

RMI 응용 프로그램을 빌드 중이며 다음 서버 클래스가 있습니다. 그러나, 내가 이클립스에서 실행할 때 다음 예외가 발생합니다. 무엇이 잘못되었으며 어떻게 해결할 수 있습니까? 비슷한 문제에 대해 온라인에서 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을 통해 정책 파일의 위치를 ​​지정해야합니다. 그리고 테스트 할 때와 같이 다른 액세스 제어 예외가 생기면 마찬가지로 닫을 때까지 해당 권한을 추가해야합니다.

하지만 보안 관리자를 사용하는 이유는 무엇입니까? 매우 드문 코드베이스 기능을 사용하지 않는 한 필요하지 않습니다. 코드베이스 기능을 사용하여 클라이언트에서 클래스를 업로드하지 않으면 서버에서 필요하지 않습니다. 희귀 한.