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