[英]java.security.AccessControlException: access denied in Java RMI Telephone Directory
[英]rmi java.security.AccessControlException
我是RIM的新手,目前正在http://java.sun.com/docs/books/tutorial/rmi/overview.html上本教程。
我可以像這樣啟動服務器:
C:\Documents and Settings\myHome>java -cp c:\home\ann\src;c:\home\ann\public_ html\classes\compute.jar -Djava.rmi.server.codebase=file:/c:/home/ann/public_htm l/classes/compute.jar -Djava.rmi.server.hostname=localhost -Djava.security.polic y=c:\home\ann\policy\server.policy engine.ComputeEngine ComputeEngine bound
但是,當我嘗試運行客戶端時,出現了異常
access: access allowed (java.lang.RuntimePermission createClassLoader) access: access allowed (java.lang.reflect.ReflectPermission suppressAccessChecks ) access: access allowed (java.lang.reflect.ReflectPermission suppressAccessChecks ) access: access allowed (java.lang.reflect.ReflectPermission suppressAccessChecks ) access: access allowed (java.lang.reflect.ReflectPermission suppressAccessChecks ) ComputePi exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exce ption is: java.rmi.UnmarshalException: error unmarshalling arguments; nested excep tion is: java.lang.ClassNotFoundException: access to class loader denied at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 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.run0(Unknown Sou rce) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour ce) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknow n Source) at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn own Source) at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) at $Proxy0.executeTask(Unknown Source) at client.ComputePi.main(ComputePi.java:27) Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex ception is: java.lang.ClassNotFoundException: access to class loader denied at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 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.run0(Unknown Sou rce) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour ce) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: access to class loader denied at sun.rmi.server.LoaderHandler.loadClass(Unknown Source) at sun.rmi.server.LoaderHandler.loadClass(Unknown Source) at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source) at java.rmi.server.RMIClassLoader.loadClass(Unknown Source) at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source) ... 10 more Caused by: java.security.AccessControlException: access denied (java.io.FilePerm ission \c:\home\jones\public_html\classes\- read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at sun.rmi.server.LoaderHandler$Loader.checkPermissions(Unknown Source) at sun.rmi.server.LoaderHandler$Loader.access$000(Unknown Source) ... 21 more
我認為問題在於客戶端的客戶端策略文件(如果我錯了,請更正),正如我們從堆棧跟蹤中看到的那樣
Caused by: java.security.AccessControlException: access denied (java.io.FilePerm ission \c:\home\jones\public_html\classes\- read)
但是,我的client.policy文件看起來像
grant codeBase "file:/c:/home/jones/public_html/classes/-" { permission java.security.AllPermission; }; grant{ permission java.net.SocketPermission "127.0.0.1:1024-65535", "connect,resolve"; };
codeBase有“文件:/ c:/ home / jones / public_html / classes /-”的AllPermission。
因此,我是否將codeBase權限設置為錯誤,所以客戶端應用程序需要更多權限?
謝謝!!!
ComputePi exception: java.security.AccessControlException: access denied (java.net.SocketPermission 1 27.0.0.1: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.(Unknown Source) at java.net.Socket.(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.lookup(Unknown Source) at client.ComputePi.main(ComputePi.java:25)
我有例外
grant{ permission java.net.SocketPermission "127.0.0.1:1024-65535", "connect,resolve"; };
但是,client.policy文件已指定
\n 授予{\n 權限java.net.SocketPermission“ 127.0.0.1:1024-65535”,“ connect,resolve”;\n };\n
access: access denied (java.net.SocketPermission myComputer resolve) java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Unknown Source) 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.InetAddress.getLocalHost(Unknown Source) at sun.rmi.transport.tcp.TCPEndpoint.(Unknown Source) at java.rmi.registry.LocateRegistry.getRegistry(Unknown Source) at java.rmi.registry.LocateRegistry.getRegistry(Unknown Source) at java.rmi.registry.LocateRegistry.getRegistry(Unknown Source) at client.ComputePi.main(ComputePi.java:24)
在第80行:
\n access:允許訪問(java.net.SocketPermission myComputer解決)\n
但是從99行到111行
\n 訪問:訪問被拒絕(java.net.SocketPermission myComputer解決)\n java.lang.Exception:堆棧跟蹤\n 在java.lang.Thread.dumpStack(未知來源)\n 在java.security.AccessControlContext.checkPermission(未知源)\n 在java.security.AccessController.checkPermission(未知源)\n 在java.lang.SecurityManager.checkPermission(未知源)\n 在java.lang.SecurityManager.checkConnect(未知來源)\n 在java.net.InetAddress.getLocalHost(未知來源)\n 在sun.rmi.transport.tcp.TCPEndpoint處。(未知源)\n 在java.rmi.registry.LocateRegistry.getRegistry(未知來源)\n 在java.rmi.registry.LocateRegistry.getRegistry(未知來源)\n 在java.rmi.registry.LocateRegistry.getRegistry(未知來源)\n 在client.ComputePi.main(ComputePi.java:24)\n
問題已解決,請參閱我的另一篇文章
您如何啟動客戶端? 啟動客戶端時是否指定策略文件?
您啟動客戶端的命令行應如下所示:
java -cp c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar
-Djava.rmi.server.codebase=file:/c:/home/jones/public_html/classes/
-Djava.security.policy=client.policy
client.ComputePi zaphod.east.sun.com 45
更新 :您寫道:
如果我將client.policy文件移動到
C:\\Program Files\\Java\\jre6\\lib\\security
您需要將示例中看到的路徑( c:\\home\\jones
等)更改為您在計算機上使用的實際路徑(代碼庫和安全文件所在的位置)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.