Проблемы с записью файла из Java-апплета - PullRequest
3 голосов
/ 22 июня 2010

Я создал простой класс Java для проверки записи файлов из апплетов:
появилось обновление

public class localfile extends Applet{
public localfile(){
    try {
        File f = new File("testfile.txt");
        BufferedWriter out = new BufferedWriter(new FileWriter(f,true));
        out.write("test");
        out.close();
    }
    catch(Exception x)
       System.err.println(x.toString());
   }
}

Я создал и подписал банку:

jar cvf localfile.jar localfile.java
jarsigner localfile.jar yourkey

HTML выглядит так: <applet code="localfile.class" archive="localfile.jar", width=300, height=600>

Ошибка, которую я получаю при каждом запуске этого апплета:

java.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/home/w/test/
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(CPCallbackHandler.java:308)
at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1400(CPCallbackHandler.java:121)
at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(CPCallbackHandler.java:473)
at sun.plugin2.applet.Plugin2ClassLoader.checkResource(Plugin2ClassLoader.java:701)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:206)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Plugin2ClassLoader.java:520)
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:2940)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1444)
at java.lang.Thread.run(Thread.java:619)
Exception: java.lang.SecurityException: trusted loader attempted to load sandboxed resource from file:/home/w/test/

Что странно: я создал похожий апплет для чтения файлов, и он работает нормально.

Есть мысли?


Я запускал этот апплет как в браузере, так и в программе просмотра апплетов. Что странно, данный апплет не работает в средстве просмотра апплетов и выдает исключение, но в браузере это нормально.

java.security.AccessControlException: access denied (java.util.PropertyPermission java.security.policy write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:725)
at localfile.<init>(localfile.java:15)
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.applet.AppletPanel.createApplet(AppletPanel.java:785)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:714)
at sun.applet.AppletPanel.run(AppletPanel.java:368)
at java.lang.Thread.run(Thread.java:619)

Итак, помимо этого странного поведения, я считаю, что моя проблема решена. Спасибо всем:)

Ответы [ 5 ]

2 голосов
/ 22 июня 2010

Предоставили ли вы политику, разрешающую чтение файлов из файловой системы?

Кажется, что вы только подписали флягу, но не использовали policytool.

1 голос
/ 22 июня 2011

Я знал, что уже довольно поздно.Но только для того, чтобы помочь любому, кто ищет эту ошибку -

С помощью Ant можно подписать несколько банок за один раз, например, java-comm.jar и т. Д.

<target name="applet.sign" description="Sign the applet jar">
<signjar jar="${applet.dir}/*.jar"
         storepass="${applet.key.password}"
         keystore="${applet.keystore}"
         alias="${applet.key.alias}"
         keypass="${applet.key.password}" />

Это подпишет все банки в каталоге.

1 голос
/ 22 июня 2010

С некоторыми оговорками вы можете включить файл политики в банку.Обратитесь к SO вопросу файл политики jar для получения дополнительной информации.

В противном случае рассмотрите возможность создания приложения Java WebStart, которое может легче читать / записывать файлы.

1 голос
/ 22 июня 2010

http://java.sun.com/docs/books/tutorial/security/tour1/step2.html

Это должно помочь вам с созданием файла политики и связью с вашей базой кода

0 голосов
/ 22 июня 2010

Я считаю, что ваша проблема в том, что каталог, включающий файл, который вы пытаетесь загрузить, находится в кодовой базе, где ищутся файлы классов и ресурсы приложения.Таким образом, вы в конечном итоге смешиваете доверенные и ненадежные ресурсы, что небезопасно.Если апплет размещен на сервере http или лучше https, проблема с файлами не возникает.

Обратите внимание, что вы можете использовать API-интерфейсы JNLP для апплетов, чтобы "открывать" или записывать файлы через диалог файлов.

При обработке ресурсов в случае исключений файл остается открытым.Обработка ресурсов должна быть написана в стиле:

Resource resource = acquire();
try {
     use(resource);
} finally {
     resource.release();
}

В вашем конкретном случае:

final FileOutputStream rawOut = new FileOutputStream(file);
try {
    ...
    out.flush();
} finally {
    rawOut.close();
}
...