Ответ 1
В принципе, я глуп, я предположил, что, поскольку Java не жаловался, что он нашел файл .policy AOK, оказывается, что он не перемещает новую копию файла .policy в рабочий каталог, решает все:-D
Привет, я получаю AccessControlException: access denied
при попытке запустить приложение RMI, которое я пишу, я не могу понять, почему я получаю это исключение, если я его открываю на порту 1099 по умолчанию или на другой динамике порт, мой файл политики в настоящее время предоставляет все (изменится, когда приложение будет завершено).
Я застрял в том, где он идет не так, любая помощь будет очень полезной
Мой код
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
if (System.getSecurityManager() == null)
{
System.setSecurityManager ( new RMISecurityManager() );
}
CreditCardServer ccs = new CreditCardServer();
int port = 1099;
try {
port = Integer.valueOf(args[0]);
}
catch (Exception e)
{
System.out.println("Invlaid Port");
}
if (((port <= 65535) && (port >= 49152)) || port ==1099)
{
System.out.println("Valid Port");
}
else
{
port = 1099;
System.out.println("Port not in Dynamic Range 49152<-->65535");
}
System.out.println(port);
LocateRegistry.createRegistry(port);
LocateRegistry.getRegistry().bind("CreditCardServer", ccs);
while (true)
{
//hum?
}
}
}
Трассировка стека
vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"
Действительный порт
65000
Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
at java.security.AccessController.checkPermission(AccessController.java:553)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
at java.net.Socket.connect(Socket.java:536)
at java.net.Socket.connect(Socket.java:492)
at java.net.Socket.<init>(Socket.java:389)
at java.net.Socket.<init>(Socket.java:203)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at bookstorecreditcardserver.Main.main(Main.java:56)
Мой файл политики
grant {
// Allow everything for now
permission java.security.AllPermission;
};
В принципе, я глуп, я предположил, что, поскольку Java не жаловался, что он нашел файл .policy AOK, оказывается, что он не перемещает новую копию файла .policy в рабочий каталог, решает все:-D
Я застрял на этом весь день (после выяснения, что мне нужно было запустить rmiregistry из командной строки), пытаясь сделать эту работу локально с Eclipse и, наконец, решить ее. Несколько указателей, чтобы спасти других этой жестокой судьбой:
1 - правильно назначить файл политики либо с флагом командной строки:
java -Djava.security.policy=/home/.../<filename>.policy ...
или поместив его прямо в свой код:
System.setProperty("java.security.policy","file:///home/.../<filename>.policy");
Вы также можете поместить его в ту же папку, что и ваш корневой каталог проекта), чтобы уменьшить URI до
file:./<filename>.policy
(используйте относительный вместо абсолютного URI - на самом деле я этого не понимал до сегодняшнего дня).
2 - убедитесь, что формат файла политики верен, например:
grant codeBase "file:<path>/bin/-" {
permission java.security.AllPermission;
};
Это должно относиться к папке, в которой находится ваш двоичный файл! Полное описание формата файла политики здесь.
Что касается этого, я бы также рекомендовал этот учебник, мне было очень полезно попасть на правильный путь.