今天在测试RMI的时候,运行server端出现问题,命令如下:
D:/rmi>java -Djava.security.policy= policy.txt RMIServer
其中policy.txt是策略文件
--------------------------------------------------------------------------------------------------------------------
Exception in thread "RMI TCP Connection(2)-192.168.12.155" java.security.AccessC
ontrolException: access denied (java.net.SocketPermission 192.168.12.155:3576 ac
cept,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.checkAccept(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.checkAcceptPermi
ssion(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.checkAcceptPermission(Unknown Sour
ce)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour
ce)
at java.lang.Thread.run(Unknown Source)
-------------------------------------------------------------------------------------------------------------------
此时, policy.txt文件如下:
---------------------------------------------------------------------------------------
grant
{
permission java.net.SocketPermission "*:1099","accept,connect,listen";
};
--------------------------------------------------------------------------------------
修改为
--------------------------------------------------------------------------------------
grant
{
permission java.net.SocketPermission "*:*","accept,connect, listen";
};
-------------------------------------------------------------------------------------
后,运行正常。
问题二:直接运行命令,不加策略文件,会出错
D:/rmi>java RMIServer
错误如下:
--------------------------------------------------------------------------------------
Exception in thread "main" java.security.AccessControlException: access denied (
java.net.SocketPermission 192.168.12.155:1099 connect,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.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind( Unknown Source)
at RMIServer.<init>(RMIServer.java:75)
at RMIServer.main(RMIServer.java:37)
---------------------------------------------------------------------------------------------
运行java -Djava.security.policy= policy.txt RMIServer后正常。
这一切是为什么呢?
D:/rmi>java -Djava.security.policy= policy.txt RMIServer
其中policy.txt是策略文件
--------------------------------------------------------------------------------------------------------------------
Exception in thread "RMI TCP Connection(2)-192.168.12.155" java.security.AccessC
ontrolException: access denied (java.net.SocketPermission 192.168.12.155:3576 ac
cept,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.checkAccept(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.checkAcceptPermi
ssion(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.checkAcceptPermission(Unknown Sour
ce)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour
ce)
at java.lang.Thread.run(Unknown Source)
-------------------------------------------------------------------------------------------------------------------
此时, policy.txt文件如下:
---------------------------------------------------------------------------------------
grant
{
permission java.net.SocketPermission "*:1099","accept,connect,listen";
};
--------------------------------------------------------------------------------------
修改为
--------------------------------------------------------------------------------------
grant
{
permission java.net.SocketPermission "*:*","accept,connect, listen";
};
-------------------------------------------------------------------------------------
后,运行正常。
问题二:直接运行命令,不加策略文件,会出错
D:/rmi>java RMIServer
错误如下:
--------------------------------------------------------------------------------------
Exception in thread "main" java.security.AccessControlException: access denied (
java.net.SocketPermission 192.168.12.155:1099 connect,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.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
ource)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind( Unknown Source)
at RMIServer.<init>(RMIServer.java:75)
at RMIServer.main(RMIServer.java:37)
---------------------------------------------------------------------------------------------
运行java -Djava.security.policy= policy.txt RMIServer后正常。
这一切是为什么呢?