📜  Java的.rmi.RMISecurityManager类在Java中

📅  最后修改于: 2022-05-13 01:54:40.615000             🧑  作者: Mango

Java的.rmi.RMISecurityManager类在Java中

RMISecurityManager通过覆盖来自SecurityManager 的所有相关访问检查方法,为作为远程对象存根加载的类实施安全策略。默认情况下,仅允许存根对象执行类定义和类访问操作。

java.lang.Object
java.lang.SecurityManager
java.rmi.RMISecurityManager

句法:

public class RMISecurityManager 
extends SecurityManager

如果没有设置安全管理器,RMI 的类加载器将不会从远程位置下载任何类。 RMISecurityManager 不适用于在浏览器安全管理器保护下运行的小程序。 RMISecurityManager 实现的策略与 SecurityManager 实现的策略没有什么不同。因此,RMI 应用程序应该使用 SecurityManager 类或其他特定于应用程序的 SecurityManager 实现而不是此类。



如何合并安全管理器类?

要在您的应用程序中使用 SecurityManager,请将以下语句添加到您的代码中(它需要在 RMI 可以从远程主机下载代码之前执行,因此它很可能需要出现在您的应用程序的 main 方法中)

句法:

System.setSecurityManager(new SecurityManager());

RMISecurityManager 实现的策略与 SecurityManager 实现的策略相同。 RMI 应用程序应使用 SecurityManager 类或其他适当的 SecurityManager 实现而不是此类。仅当设置了安全管理器时,RMI 的类加载器才会从远程位置下载类。

现在让我们继续这个类的构造函数如下:

  • RMISecurityManager() :构造一个新的 RMISecurityManager

执行:

if (System.getSecurityManager() == null) 
{
    // Setting the RMISecurityManager on System
    System.setSecurityManager(new SecurityManager());
} 

小程序通常运行在已经有安全管理器的容器中,所以小程序一般不需要设置安全管理器。如果您有一个独立的应用程序,您可能需要设置一个 SecurityManager 以启用类下载。这可以通过将以下内容添加到您的代码中来完成。 (它需要在 RMI 可以从远程主机下载代码之前执行,因此它很可能需要出现在您的应用程序的 main 方法中,从下图可以更好地理解。

图 1:



// Protected synchronized method
protected static synchronized void setSecurityManager() 
{
    if (System.getSecurityManager() == null) 
    {
        // Setting the RMISecurityManager on System
        System.setSecurityManager(new RMISecurityManager());
    }
}

图 2:

// Synchronized method
synchronized static void ensureSecurityManager() 
{
    if (System.getSecurityManager() == null) 
    {
        // Setting the RMISecurityManager on System
        System.setSecurityManager(new RMISecurityManager());
    }
}

图 3:

// Protected synchronized method
protected static synchronized void setSecurityManager() 
{
    if (System.getSecurityManager() == null) 
    {
        // Setting the RMISecurityManager on System
        System.setSecurityManager(new RMISecurityManager());
    }
}

例子

Java
// Java Program to Illustrate RMISecurityManager Class
// Via creating Registry and Rebinding Service
  
// Importing required classes
import java.lang.Object;
import java.lang.SecurityManager;
import java.rmi.RMISecurityManager;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
  
        // Try block to check for exceptions
        try {
  
            // Setting the RMISecurityManager on System
            System.setSecurityManager(
                new RMISecurityManager());
            RmiService service = new RmiServiceImpl();
  
            // First we will be creating registry
            // using createRegistry() method
            LocateRegistry.createRegistry(6600);
  
            // Now rebinding the service
            // using rebind method
            Naming.rebind(
                "rmi://127.0.0.1:6600/PersonService",
                service);
  
            // Display message on the console for
            // successful execution of the program
            System.out.println("Service Start!");
        }
  
        // Catch block to handle exceptions
        catch (Exception e) {
  
            // Printing the line number where exception
            // occured using printStackTrace() method
            e.printStackTrace();
        }
    }
}


输出:

Service Start!

在控制台上,我们将显示如上所示的显示消息。