Ошибка прав доступа к файлам в Java-апплете

У меня есть апплет Java, который требует использования некоторых папок для чтения некоторых файлов и т.д. Папки находятся в правильном месте и находятся в том же каталоге, что и index.html (который запускает апплет). Вот ошибка, которую выдает JApplet:

java.lang.reflect.InvocationTargetException
    at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(DeployAWTUtil.java:116)
    at sun.plugin2.applet.Plugin2Manager.runOnEDT(Plugin2Manager.java:3541)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3072)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1497)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission ./results read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
    at java.io.File.list(File.java:971)
    at java.io.File.listFiles(File.java:1129)
    at WhoHasMore.JShellFrame.getDefaultResultsFileName(JShellFrame.java:453)
    at WhoHasMore.JShellFrame.<init>(JShellFrame.java:28)
    at WhoHasMore.<init>(WhoHasMore.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at sun.plugin2.applet.Plugin2Manager$13.run(Plugin2Manager.java:3060)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:677)
    at java.awt.EventQueue.access$000(EventQueue.java:85)
    at java.awt.EventQueue$1.run(EventQueue.java:638)
    at java.awt.EventQueue$1.run(EventQueue.java:636)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:647)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception: java.lang.reflect.InvocationTargetException

Как видите, ошибка исходит от

Caused by: java.security.AccessControlException: access denied (java.io.FilePermission ./results read)

Почему доступ запрещен для чтения из папки под названием «результаты»? Как я могу это исправить?


person CodeGuy    schedule 08.04.2012    source источник


Ответы (2)


Метод, который вы пытаетесь использовать (java.io.File.listFiles), не работает через HTTP. Вам нужно будет выбрать другой способ перечисления файлов, например, поместить список файлов в текстовый файл по известному URL-адресу и загрузить его или сделать его частью jar-файла апплета.

person Community    schedule 08.04.2012

Почему доступ запрещен для чтения из папки под названием «результаты»?

Песочница Java препятствует доступу апплета к файловой системе на компьютере пользователя.

Как я могу это исправить?

Если вы хотите, чтобы ваш апплет мог делать такие вещи, вы должны:

  • создать подписанный JAR и
  • заставить пользователя принять сертификат / ваш JAR-файл в качестве доверенного приложения.
person Stephen C    schedule 08.04.2012
comment
Могу ли я сделать это с помощью файла политики? Если да, то как мне это сделать и каким должно быть имя файла? Где будет находиться файл политики? - person CodeGuy; 08.04.2012
comment
Папки находятся в правильном месте и находятся в том же каталоге, что и index.html (который запускает апплет). Это не файловая система клиента, но сервер. @duskwuff выбрал правильный подход. - person Andrew Thompson; 08.04.2012
comment
@ Эндрю Томпсон - согласен. Я был слишком сосредоточен на проблеме устранения исключения, а не на более серьезной проблеме, связанной с тем, чтобы заставить все приложение делать то, что на самом деле хочет ОП. - person Stephen C; 08.04.2012
comment
Ни один @duskwuff не был неправильным. Я смог подписать банку, обернуть вызов listFiles() в AcccessControll.doPrivileged(), и все заработало нормально. Это не имеет ничего общего с HTTP и все, что связано с разрешениями. - person CodeGuy; 08.04.2012