RMI 服务器 java.security.AccessControlException: 访问被拒绝
RMI server java.security.AccessControlException: access denied
我正在构建一个 RMI 应用程序并且我有以下服务器 class。但是,当我在 eclipse 中 运行 它时,我得到以下异常。出了什么问题,我该如何解决?我花了最后 2 天时间在网上阅读类似的问题,但找不到解决方案。我怀疑它与策略文件有关,但我不知道如何使用它。另外,如果问题出在我 运行 的方式上,请给我在 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.<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)
很简单。
access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")
意味着策略文件必须授予权限
java.net.SocketPermission "localhost:2019", "listen,resolve"
或者任何正确的语法。使用 policytool
使其正确。您可能希望通配端口号。并且您必须通过 java.security.policy
系统 属性 指定策略文件的位置。而当你得到其他访问控制异常时,就像你在测试中一样,你必须同样添加相应的权限,直到关闭。
但我想问的是您为什么要使用安全管理器。除非您要使用代码库功能,否则没有必要,这很少见,并且在服务器中也没有必要,除非您要使用代码库功能从客户端上传 类 , 这更罕见。
我正在构建一个 RMI 应用程序并且我有以下服务器 class。但是,当我在 eclipse 中 运行 它时,我得到以下异常。出了什么问题,我该如何解决?我花了最后 2 天时间在网上阅读类似的问题,但找不到解决方案。我怀疑它与策略文件有关,但我不知道如何使用它。另外,如果问题出在我 运行 的方式上,请给我在 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.<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)
很简单。
access denied ("java.net.SocketPermission" "localhost:2019" "listen,resolve")
意味着策略文件必须授予权限
java.net.SocketPermission "localhost:2019", "listen,resolve"
或者任何正确的语法。使用 policytool
使其正确。您可能希望通配端口号。并且您必须通过 java.security.policy
系统 属性 指定策略文件的位置。而当你得到其他访问控制异常时,就像你在测试中一样,你必须同样添加相应的权限,直到关闭。
但我想问的是您为什么要使用安全管理器。除非您要使用代码库功能,否则没有必要,这很少见,并且在服务器中也没有必要,除非您要使用代码库功能从客户端上传 类 , 这更罕见。