RMI服务器java.security.AccessControlException:访问被拒绝

时间:2017-11-17 19:15:13

标签: java eclipse ssl rmi policyfiles

我正在构建一个RMI应用程序,我有以下服务器类。但是,当我在eclipse中运行它时,我得到以下异常。有什么问题,我该如何解决?我花了最近两天在线阅读类似的问题,但我找不到解决方案。我怀疑它与策略文件有关,但我不知道如何使用它。此外,如果问题与我的运行方式有关,请你在eclipse中给我这样做的指示。

PivotFields("[Fiscal Period].[Year].[Year]")

-

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");
    }
}

1 个答案:

答案 0 :(得分:1)

这很简单。

access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")

表示策略文件必须授予权限

java.net.SocketPermission "localhost:2019", "listen,resolve"

或任何正确的语法。使用policytool将其弄清楚。您可能想要通配符端口号。您必须通过java.security.policy系统属性指定策略文件的位置。当您获得其他访问控制异常时,就像在测试中一样,您必须同样添加相应的权限,直到关闭。

但我宁愿问你为什么要使用安全管理器。除非您打算使用代码库功能,这是非常罕见的,除非您打算使用代码库功能从客户端上传类,否则它不需要在服务器中使用。罕见。