어제 Java RMI를 사용해 보았습니다.이 태양 튜토리얼 (http://java.sun.com/docs/books/tutorial/rmi/index.html)을 발견하고 서버 구현을 시작했습니다. rmiregistry에 나는 다음과 같은 스택 트레이스를 나타내는 AccessControlException를 얻을) 실행 :Java RMI 튜토리얼 - AccessControlException : 액세스가 거부되었습니다 (java.io.FilePermission
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 파일은 다음과 같습니다 I've는이 일을 시도
grant {
permission java.security.AllPermission;
};
그러나
... ,536grant {
permission java.security.AllPermission;
permission java.io.FilePermission "file://C:/ProjX/server/serverProj/bin/usermanager", "read";
};
...이 하나의 (그리고 몇몇 다른 :-() :
grant codeBase "file:///-" {
permission java.security.AllPermission;
};
그러나 모든 경우에 결과가 동일
. 예, 정책 파일이 경로에 있습니다 (정책 파일에 잘못된 문장을 쓸 때 구문 분석 예외가 나타납니다). 다른 여러 "/"및 "\"별자리를 사용해 보았지만 효과가 없습니다. 이클립스 내 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) 클래스는이 경로에있는 "C :/ProjX/서버/serverProj/bin/usermanager/"를 입력하십시오. 내가 실체화하고 레지스트리에 그루터기를 리 바인드 주요 방법은, 다른 패키지에 있으며 다음과 같습니다
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 B"를 사고 싶지 않습니다 ;-).
비슷한 문제가 있습니다. 이 방법으로 해결했습니다. - https://stackoverflow.com/a/44275905/1509058 –