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

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

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

Исключение ввода-вывода: доступ запрещен

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

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: последние два дня я также провел за чтением Stackoverflow и поиском в Google. Я твердо верю, что сделал все, что должен был сделать...


person DavidS    schedule 02.07.2012    source источник
comment
Просто чтобы проверить, можете ли вы запустить свой браузер от имени администратора и посмотреть, пишет ли он?   -  person Suave Nti    schedule 02.07.2012
comment
Какова трассировка стека выброшенного исключения?   -  person trashgod    schedule 02.07.2012
comment
По поводу каждого улова звоните Throwable.printStackTrace(). Я удивлен, что вы бродили по ТАК 2 дня и не увидели этого совета!   -  person Andrew Thompson    schedule 02.07.2012
comment
@AndrewThompson Ха-ха, ты меня понял .. Прочитал пару из них! Я нашел решение своей проблемы, см. исходный пост :)   -  person DavidS    schedule 02.07.2012
comment
Я нашел решение своей проблемы Рад, что вы разобрались! :) Вы должны ввести это как ответ и принять ответ. Таким образом, другим будет легче найти позже.   -  person Andrew Thompson    schedule 02.07.2012
comment
Спасибо :) Не смог опубликовать ответ на свой вопрос (потому что у меня было меньше 10 репутации), но теперь, когда у меня достаточно, я добавил его :)   -  person DavidS    schedule 02.07.2012


Ответы (1)


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

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

or

System.getProperty("user.home")

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

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

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