昨天,我试着开始使用Java。我找到了这个sun教程(http://java.sun.com/docs/books/tutorial/rmi/index.html),并从服务器内嵌开始。但是,每次我启动pogram ( rmiregistry正在运行)时,我都会得到一个AccessControlException,它的StackTrace如下:
LoginImpl exception:
java.security.AccessControlException: access denied (java.io.FilePermission \\\C\ProjX\server\serverProj\bin\usermanager read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
at java.io.File.exists(File.java:700)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:80)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:55)
at java.net.URL.openConnection(URL.java:943)
at sun.rmi.server.LoaderHandler.addPermissionsForURLs(LoaderHandler.java:1020)
at sun.rmi.server.LoaderHandler.access$300(LoaderHandler.java:52)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1108)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1089)
at sun.rmi.server.LoaderHandler$1.run(LoaderHandler.java:861)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.server.LoaderHandler.lookupLoader(LoaderHandler.java:858)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:541)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at startserver.StartServer.main(StartServer.java:22)我的server.policy文件如下所示:
grant {
permission java.security.AllPermission;
};但我也试过这个:
grant {
permission java.security.AllPermission;
permission java.io.FilePermission "file://C:/ProjX/server/serverProj/bin/usermanager", "read";
};..。还有这个(还有其他几个:-()):
grant codeBase "file:///-" {
permission java.security.AllPermission;
};但在任何情况下,结果都是一样的。是的,策略文件在路径中(当我将错误的状态写入策略文件时,我看到了一个Parse异常)。我尝试了其他几个"/“和"”星座,但没有效果。
我使用Eclipse,我的VM参数如下:
-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy编译的远程接口类和接口实现类(LoginImpl)都在此路径中:LoginImpl。我实例化存根并将其重新绑定到注册表的main方法位于另一个包中,如下所示:
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Login";
Login login = new LoginImpl();
Login stub = (Login) UnicastRemoteObject.exportObject(login, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("LoginImpl bound");
} catch (Exception e) {
System.err.println("LoginImpl exception:");
e.printStackTrace();
}
}有人给我提建议了吗?
所以问题是一样的( java.rmi.UnmarshalException显示更改代码库不是我的AccessControlException的解决方案)。不:我不想买一个插件"G“。
发布于 2008-10-07 20:14:02
授予所有代码的所有权限是非常糟糕的。任何RMI客户端都可以在登录用户时做它想做的事情。通常,请尽可能合理地限制权限,特别是当您不知道代码来自何处时。
回到问题上..。
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/这应该是"file:///C:/..."或"file:/C:/..."。想想http。"http://C:/..."指的是名为C的主机。注意,异常消息删除了冒号,因为这只是端口号的语法。
即使将权限授予所有代码,也会获得安全异常,原因是RMI在相关URL的情况下将权限限制到相应的权限(使用AccessController doPrivileged的两个参数形式)。
发布于 2008-10-14 18:10:28
好的,我拿到了。它不是rmiregistry属性(工作时没有任何参数)。在我的代码库中有两个错误:
-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy..。相反,应该是这样:
-Djava.rmi.server.codebase=file:/C:/ProjX/server/serverProj/bin/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy=>文件:/(只有一个斜杠)+错误的包结尾。
但是,我的第一个想法是,跟踪是如此的混乱,政策文件或策略配置的某些地方一定是错误的。
尽管如此:谢谢你的帮助和快乐的黑客。;-)
发布于 2008-11-12 18:18:47
还可以以编程方式设置java.rmi.server.codebase属性:
Hello h = null;
Properties props = System.getProperties();
System.setProperty("java.rmi.server.codebase", "file:/C:/PROJECTX/bin/");
try {
h = new HelloImpl();
Naming.bind("//localhost:1099/HelloService", h);
System.out.println("Serwis gotów...");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}一些假设的Hello RMI服务。
https://stackoverflow.com/questions/179799
复制相似问题