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

RMI服务器java.security.AccessControlException:访问被拒绝,java,eclipse,ssl,rmi,policyfiles,Java,Eclipse,Ssl,Rmi,Policyfiles,我正在构建一个RMI应用程序,我有以下服务器类。然而,当我在eclipse中运行它时,我得到了以下异常。什么地方出了问题,我该如何解决?在过去的两天里,我一直在网上阅读类似的问题,但我找不到解决办法。我怀疑它与策略文件有关,但我不知道如何使用它。另外,如果问题出在我运行它的方式上,您可以给我在eclipse中这样做的说明吗 import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.re

我正在构建一个RMI应用程序,我有以下服务器类。然而,当我在eclipse中运行它时,我得到了以下异常。什么地方出了问题,我该如何解决?在过去的两天里,我一直在网上阅读类似的问题,但我找不到解决办法。我怀疑它与策略文件有关,但我不知道如何使用它。另外,如果问题出在我运行它的方式上,您可以给我在eclipse中这样做的说明吗

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

访问被拒绝(“java.net.SocketPermission”“localhost:2019”“侦听,解析”)
java.security.AccessControlException:拒绝访问(“java.net.SocketPermission”“localhost:2019”“侦听,解析”)
位于java.security.AccessControlContext.checkPermission(未知源)
位于java.security.AccessController.checkPermission(未知源)
位于java.lang.SecurityManager.checkPermission(未知源)
位于java.lang.SecurityManager.checkListen(未知源)
位于java.net.ServerSocket.bind(未知源)
位于java.net.ServerSocket。(未知源)
位于java.net.ServerSocket。(未知源)
位于javax.rmi.ssl.SslRMIServerSocketFactory$1。(来源不明)
位于javax.rmi.ssl.SslRMIServerSocketFactory.createServerSocket(未知源)
位于sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(未知源)
位于sun.rmi.transport.tcp.tcpttransport.listen(未知源)
位于sun.rmi.transport.tcp.tcpttransport.exportObject(未知源)
位于sun.rmi.transport.tcp.TCPEndpoint.exportObject(未知源)
位于sun.rmi.transport.LiveRef.exportObject(未知源)
位于sun.rmi.server.UnicastServerRef.exportObject(未知源)
位于sun.rmi.registry.RegistryImpl.setup(未知源)
位于sun.rmi.registry.RegistryImpl。(未知源)
位于sun.rmi.registry.RegistryImpl。(未知源)
位于java.rmi.registry.LocateRegistry.createRegistry(未知源)
在MyServer.main(MyServer.java:27)
这很简单

access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")
表示策略文件必须授予权限

java.net.SocketPermission "localhost:2019", "listen,resolve"
或者不管正确的语法是什么。使用
policytool
将其设置正确。您可能需要通配符端口号。您必须通过
java.security.policy
系统属性指定策略文件的位置。当您获得其他访问控制异常时,正如您在测试中所做的那样,您必须同样地添加相应的权限,直到关闭

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

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