Самоподписанный апплет генерирует исключение SecurityException при записи в файл

Я хочу создать апплет, способный загружать файлы на компьютер, а затем открывать их в соответствующем редакторе (при сохранении файла его снова нужно загрузить обратно). Однако, прежде чем я потрачу часы на то, чтобы заставить его работать, я должен убедиться, что он действительно управляем (сделал это с помощью Java Desktop Application, а не апплета).

Поэтому я написал простой апплет, который создает файл, если он не существует. Приложение подписано и загружается в браузере как следует. На экране написано следующее:

IO Exception: доступ запрещен

Я пометил различные ошибки, поэтому я знаю, какая из них дает сбой. Ниже мой апплет:

import javax.swing.*;
import java.security.*;
import java.io.*;

public class DocumentApplet extends JApplet
{
    private static final long serialVersionUID = -2354727776089972258L;

    public void start ()
    {
        add ( new JButton ("Hello, World") );

        AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext();
        try
        {
            acc.checkPermission(new FilePermission("test.txt", "write"));
        }
        catch (SecurityException e)
        {
            add (new JLabel ("Permission Exception: " + e.getMessage()));
            return;
        }

        try
        {
            File f = AccessController.<File>doPrivileged(new PrivilegedAction<File>()
            {
                public File run()
                {
                    return new File ("test.txt");
                }
            });

            if ( ! f.exists())
            {
                f.createNewFile();
            }
        }
        catch (AccessControlException e)
        {
            add (new JLabel ("Access: " + e.getMessage()));
        }
        catch (IOException e)
        {
            add ( new JLabel ("IO Exception: " + e.getMessage()));
        }
    }
}

Это последнее исключение, которое выбрасывается. Обратите внимание, что в первую очередь я проверяю права доступа. Эта проверка не подведет.

Апплет самоподписан, но это только временно. Я не хочу тратить сотни долларов на покупку сертификата, если апплет выходит из строя...

Когда я запускаю приложение с appletviewer, код работает. Это нормально, но мне нужно знать, что это сработает, когда я куплю настоящий сертификат.

HTML-код:

<applet code="DocumentApplet" archive="applet.jar" width="300" height="200">
</applet>

Среда: Windows7 + JDK 1.7.0_05

PS: последние два дня я также читал в Stackru и искал в Google. Я твердо верю, что я сделал все, что я должен делать...

1 ответ

Решение

Я понятия не имею, в чем причина этого, но мне удалось успешно записать файл, добавив к имени файла префикс:

System.getProperty("java.io.tmpdir")

или же

System.getProperty("user.home")

Это был дикий выстрел, потому что, так как в сообщении об ошибке говорилось "Доступ запрещен", я подумал, что это из-за безопасности.

Так что всем остальным, у кого может быть такая же проблема:

  • Не пишите файл, делайте любые другие каталоги, кроме двух предоставленных. Помните, что Windows обычно не позволяет записывать файлы в C:\ даже для пользователей, использующих Windows Explorer.
Другие вопросы по тегам