【问题标题】:rmi server throws AccessControlExceptionrmi 服务器抛出 AccessControlException
【发布时间】:2016-06-23 19:59:56
【问题描述】:

我正在尝试使用来自here 的教程建立客户端-服务器关系。我的服务器类在我的路径中的引擎包中:/home/rozerin/IdeaProjects/computetest/src/main/java/engine 和客户端,接口包也在 ~/main/java 包中。 就像之前关于这个问题的问题中所建议的那样,我用“/”结束了我的目录以获得策略文件中的权限,但它不起作用。现在,我的策略文件在引擎文件夹中。 我正在使用 Intellij Idea 进行编译,但我没有使用 IDE,因为我正在尝试从 ubuntu 中的命令行构建服务器。我不知道出了什么问题,我当时很困惑。

我的命令行参数如下;

java -cp /home/rozerin/IdeaProjects/computetest/src/main/java:/home/rozerin/Public/public_html/classes/compute.jar -Djava.rmi.server.codebase=http://mycomputer/home/rozerin/IdeaProjects/computetest/src/main/java/compute.jar -Djava。 rmi.server.hostname=mycomputer.example.com -Djava.security.policy=server.policy engine/ComputeEngine

我的客户端类如下;

package client;

/**
 * Created by rozerin on 08.03.2016.
 */
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.math.BigDecimal;
import compute.Compute;

public class ComputePi {
 public static void main(String args[]) {
    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new SecurityManager());
    }
    try {
        String name = "Compute";
        Registry registry = LocateRegistry.getRegistry(args[0]);
        Compute comp = (Compute) registry.lookup(name);
        Pi task = new Pi(Integer.parseInt(args[1]));
        BigDecimal pi = comp.executeTask(task);
        System.out.println(pi);
    } catch (Exception e) {
        System.err.println("ComputePi exception:");
        e.printStackTrace();
    }
  }
}

我的服务器类如下;

package engine;

/**
 * Created by rozerin on 08.03.2016.
 */
 import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import compute.Compute;
import compute.Task;

public class ComputeEngine implements Compute {

    public ComputeEngine() {
    super();
    }

    public <T> T executeTask(Task<T> t) {
    return t.execute();
    }

    public static void main(String[] args) {
    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new SecurityManager());
    }
      try {
        String name = "Compute";
        Compute engine = new ComputeEngine();
        Compute stub =
                (Compute) UnicastRemoteObject.exportObject(engine, 0);
        Registry registry = LocateRegistry.getRegistry();
        registry.rebind(name, stub);
        System.out.println("ComputeEngine bound");
    } catch (Exception e) {
        System.err.println("ComputeEngine exception:");
        e.printStackTrace();
    }
 }
}

我的政策文件是

grant codeBase "file:/home/rozerin/IdeaProjects/computetest/src/main/java/"{ 权限 java.security.AllPermission; };

堆栈跟踪是;

ComputeEngine 异常: java.security.AccessControlException:访问被拒绝(“java.net.SocketPermission”“127.0.0.1:1099”“connect,resolve”) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:474) 在 java.security.AccessController.checkPermission(AccessController.java:685) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) 在 java.net.Socket.connect(Socket.java:574) 在 java.net.Socket.connect(Socket.java:528) 在 java.net.Socket.(Socket.java:425) 在 java.net.Socket.(Socket.java:208) 在 sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 在 sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147) 在 sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341) 在 sun.rmi.registry.RegistryImpl_Stub.rebind(未知来源) 在engine.ComputeEngine.main(ComputeEngine.java:33)

"at engine.ComputeEngine.main(ComputeEngine.java:33)" 是它使用服务器类的 rebind 方法的地方。

界面在我分享的网站上,我不想让这个地方太拥挤。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 可以在安全策略文件中使用grant { permission java.security.AllPermission; };
  • 又是同样的错误。似乎找不到策略文件。你怎么看?
  • 如果您的“服务器无法编译”,您究竟是如何设法运行它并获得异常的?
  • @EJP 我正在使用命令行
  • 这不是我问题的答案。您无法执行无法编译的代码。所以要么你没有得到这个例外,要么你的标题是错误的。

标签: java intellij-idea rmi


【解决方案1】:

对于服务器端和客户端都应该使用这个:

System.setProperty("java.security.policy", "path_to_your_Security_policy_file_located_in_file_system");
System.setSecurityManager(new RMISecurityManager());

安全策略文件应包含

 grant {
    permission java.security.AllPermission;
    };

我认为这可能会对你有所帮助。

【讨论】:

  • 文件路径应该这样写吗? public static void main(String[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } 尝试 { System.setProperty("java.security.policy", "/home/rozerin/IdeaProjects/computetest/src/main/java/engine/server.policy");字符串名称 = “计算”;计算引擎 = 新的 ComputeEngine();等等。
  • 在我的例子中,我使用了安全策略文件路径"C:\\Users\\Documents\\NetBeansProjects\\RmiServerSide\\src\\com\\test\\server\\Security.policy"
  • 我的和你的一样,但在 ubuntu 文件系统中。我试过了,但还是不行。你认为我的服务器类有问题吗?
  • 检查您的文件夹权限。您也可以尝试将您的策略​​文件放在主文件夹中并测试它是否有效。
  • 你可以按照这里的基本。 ataurrahmanmunna.blogspot.com/2015/12/…
猜你喜欢
  • 2021-03-13
  • 2015-02-03
  • 2010-12-02
  • 2016-09-24
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多