6

Java rmi で開発されたデスクトップ アプリケーションを実行しようとしています。このアプリケーションを Eclipse で実行しようとすると、次のエラーが発生します。事前に感謝します。

Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)
    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.checkPropertiesAccess(Unknown Source)
    at java.lang.System.getProperties(Unknown Source)
    at .HeadOfficeManager.Manager.main(Manager.java:103)

これがコードです。

public static void main(String args[])
{
    Manager frame = new Manager();
    frame.setVisible(true);
    // frame.show(); old 1.4

    // Create and install a security manager
    if (System.getSecurityManager()== null)
    {
        System.setSecurityManager(new RMISecurityManager());
    }
    try
    {
        Properties prop = System.getProperties();
        String httpPath = prop.getProperty("HTTPPath");
        new ClassFileServer(80, httpPath);
    }
    catch (IOException e)
    {}

    try
    {
        java.rmi.registry.LocateRegistry.createRegistry(1099);
        System.out.println("RMI registry ready.");
    }
    catch (Exception e)
    {
        System.out.println("Exception starting RMI registry:");
        e.printStackTrace();
    }
    try
    {
        RMIHandler = new ManagerRMIHandler();

        // Bind the remote object's stub in the registry
        Registry registry = LocateRegistry.getRegistry();
        registry.rebind("HeadOfficeManager", RMIHandler);

        System.err.println("Server ready");
    }
    catch (Exception e)
    {
        System.err.println("Server exception: " + e.toString());
        e.printStackTrace();
    }
4

2 に答える 2

13
  1. Eclipse でアプリケーションを右クリックし、実行構成をクリックします。
  2. として仮想マシンの引数を追加します -Djava.security.policy =java.policy.applet
  3. ファイルを作成し、名前を付けますjava.policy.applet
  4. そのファイルに以下の行を追加します。

    grant  
    {  
        permission java.security.AllPermission;  
    };
    
  5. 保存してアプリケーションを実行します。

これにより、Java アプリケーションにすべてのセキュリティ権限が付与されます。

于 2012-09-12T12:22:43.577 に答える
2

SecurityManager をインストールしましたが、コードを実行するための十分な権限を .policy ファイルに与えていません。例外は、どの権限が不足しているかを示していますが、おそらくもっと多くの権限があります。-Djava.security.debug=access,failure を指定してアプリケーションを実行し、他にどのようなセキュリティ問題があるかを確認してください。

しかし、ここでの本当の問題は、なぜセキュリティ マネージャが必要なのかということです。RMIコードベース機能を使用している場合、RMIの観点から、RMIサーバーでのみ必要です。それ以外の場合は、削除を検討する必要があります。

createRegistryまた、静的変数など、ガベージコレクションされない場所に結果を保存する必要があります。そして、一度それを行うと、getRegistry()呼び出しは冗長になります.

于 2012-06-11T11:00:43.317 に答える