2010-11-18 224 views
3

我試圖得到一個RMI連接下去。我遇到了很多安全問題,但一直無法找到解決辦法。我執行我的jar文件有:RMI連接被拒絕

java -Djava.security.policy=java.security.AllPermission -jar "myjarfile" 

的代碼,我一直用它來創建此就是:

public class server 
{ 
    public static void main(String args[])throws Exception 
    { 
    if (System.getSecurityManager() == null) 
     System.setSecurityManager (new RMISecurityManager() { 
     public void checkConnect (String host, int port) {} 
     public void checkConnect (String host, int port, Object context) {} 
     }); 

    try 
    { 
     sampleserverimpl server = new sampleserverimpl(); 
     System.out.println("SERVER IS WAITING"); 
     LocateRegistry.createRegistry(2020); 

     //Runtime.getRuntime().exec("rmiregistry 2020"); 
     Naming.rebind("//localhost:2020/SERVER", server); 

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

我收到的錯誤跟蹤:

Exception in thread "RMI TCP Connection(idle)" java.security.AccessControlExcept 
ion: access denied (java.net.SocketPermission 127.0.0.1:31199 accept,resolve)jav 
a.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 

    java.io.EOFException 

我曾嘗試不同的方式來解決這個問題,任何人都可以在這裏看到問題嗎?

謝謝

回答

6

-Djava.security.policy接受指向一個策略文件中又包含了權限的URL。所以,你應該有:-Djava.security.policy=/some/path/my.policy作爲JVM參數,其中my.policy文件包含:

grant { 
    permission java.security.AllPermission; 
}; 

此外,爲了避免檢查出現在你的代碼中的NULL和手動創建一個SecurityManager的,你可以要求一個安全管理器是通過傳遞JVM開關自動爲您的應用程序安裝:-Djava.security.manager

你最終JVM調用看起來應該像:

java -Djava.security.manager -Djava.security.policy=/some/path/my.policy 
+0

現在運行,謝謝。試用過這個文件,但沒有添加到安全管理器中。 +1 – chrissygormley 2010-11-18 12:26:51

0

這是兩個單獨的例外。首先是權限問題。第二個,EOFException可能有多種原因。我需要看到java -version和完整的堆棧跟蹤來進一步協助。

+0

我有幾分同樣的問題,我的應用程序,它使用RMI運行到一個EOFException類和崩潰,但如果我設置權限爲所有權限都運行正常。任何允許可以導致這種情況的想法? – Oli 2014-04-07 10:35:18