Java 自签名小程序在写入文件时引发SecurityException

Java 自签名小程序在写入文件时引发SecurityException,java,applet,self-signed,securityexception,appletviewer,Java,Applet,Self Signed,Securityexception,Appletviewer,我想制作一个小程序,能够将文件下载到计算机上,然后在相关编辑器中打开它们(保存文件后,应该会再次上传)。然而,在我花费数小时让它工作之前,我必须确保它实际上是可管理的(使用Java桌面应用程序而不是小程序来完成) 所以我编写了一个简单的小程序,如果文件不存在,它会创建一个文件。应用程序已签名,并按应加载到浏览器中。以下内容将写入屏幕: IO异常:访问被拒绝 我已经标记了不同的错误,所以我知道哪一个失败了。下面是我的小程序: import javax.swing.*; import java.se

我想制作一个小程序,能够将文件下载到计算机上,然后在相关编辑器中打开它们(保存文件后,应该会再次上传)。然而,在我花费数小时让它工作之前,我必须确保它实际上是可管理的(使用Java桌面应用程序而不是小程序来完成)

所以我编写了一个简单的小程序,如果文件不存在,它会创建一个文件。应用程序已签名,并按应加载到浏览器中。以下内容将写入屏幕:

IO异常:访问被拒绝

我已经标记了不同的错误,所以我知道哪一个失败了。下面是我的小程序:

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()));
        }
    }
}
import javax.swing.*;
导入java.security.*;
导入java.io.*;
公共类DocumentApplet扩展了JApplet
{
私有静态最终长serialVersionUID=-2354727776089972258L;
公共无效开始()
{
添加(新的JButton(“你好,世界”);
AccessControlContext acc=(AccessControlContext)System.getSecurityManager().getSecurityContext();
尝试
{
acc.checkPermission(新文件权限(“test.txt”、“write”);
}
捕获(安全异常e)
{
添加(新JLabel(“权限异常:+e.getMessage()));
回来
}
尝试
{
文件f=AccessController.doPrivileged(新的PrivilegedAction()
{
公共文件运行()
{
返回新文件(“test.txt”);
}
});
如果(!f.exists())
{
f、 createNewFile();
}
}
捕获(AccessControlException e)
{
添加(新的JLabel(“Access:+e.getMessage());
}
捕获(IOE异常)
{
添加(新JLabel(“IO异常:+e.getMessage()));
}
}
}
这是最后一个被抛出的异常。请注意,我要做的第一件事是检查权限。那次检查没有失败

小程序是自签名的,但这只是暂时的如果小程序出现故障,我不想花费数百美元购买证书。

当我使用appletviewer运行应用程序时,代码正常工作。没关系,但我需要知道,当我买了一个真正的证书时,它会起作用

HTML代码:

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

环境:Windows7+JDK 1.7.0_05


PS:过去两天我也在阅读Stackoverflow和搜索Google。我坚信我已经完成了我应该做的一切…

我不知道这是什么原因,但我通过在文件名前加上以下前缀成功地写入了文件:

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

这是一个疯狂的尝试,因为错误消息告诉我“拒绝访问”,我认为这是因为安全问题

因此,对于可能有相同问题的所有其他人:

  • 除了提供的两个目录外,不要将文件写入任何其他目录。请记住,Windows通常不允许将文件写入C:\,即使对于使用Windows资源管理器的用户也是如此

我不知道这是什么原因,但我成功地通过在文件名前加上以下前缀来写入文件:

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

这是一个疯狂的尝试,因为错误消息告诉我“拒绝访问”,我认为这是因为安全问题

因此,对于可能有相同问题的所有其他人:

  • 除了提供的两个目录外,不要将文件写入任何其他目录。请记住,Windows通常不允许将文件写入C:\,即使对于使用Windows资源管理器的用户也是如此

只需检查您的浏览器是否可以以管理员身份运行,并查看它是否写入?引发异常的stacktrace是什么?对于每个捕获,请调用
Throwable.printStackTrace()
-我很惊讶您连续两天浏览而没有看到该建议@AndrewThompson哈哈,你抓到我了。。我读过几本!我找到了我问题的解决方案,请参阅原始帖子:)“我找到了我问题的解决方案”很高兴你把它整理好了!:)您应该将其作为答案输入并接受答案。这样以后其他人会更容易找到。只需检查您的浏览器是否可以作为管理员运行,并查看它是否写入?引发异常的stacktrace是什么?对于每个捕获,请调用
Throwable.printStackTrace()
-我很惊讶您连续两天如此浏览而没有看到该建议@AndrewThompson哈哈,你抓到我了。。我读过几本!我找到了我问题的解决方案,请参阅原始帖子:)“我找到了我问题的解决方案”很高兴你把它整理好了!:)您应该将其作为答案输入并接受答案。这样以后别人会更容易找到。