Самоподписанный апплет генерирует исключение 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.