1

我正在构建一个 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");
    }
}

--

access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")
    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.checkListen(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at javax.rmi.ssl.SslRMIServerSocketFactory$1.<init>(Unknown Source)
    at javax.rmi.ssl.SslRMIServerSocketFactory.createServerSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.listen(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
    at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
    at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
    at sun.rmi.registry.RegistryImpl.setup(Unknown Source)
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source)
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source)
    at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source)
    at MyServer.main(MyServer.java:27)
4

1 回答 1

1

这很简单。

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

意味着策略文件必须授予权限

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

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

但我宁愿问你为什么要使用安全管理器。除非您要使用代码库功能,否则这是没有必要的,这是相当罕见的,并且在服务器中没有必要,除非您要使用代码库功能从客户端上传类,这很多更罕见。

于 2017-11-18T23:20:21.517 回答