我创建了简单的Java类来测试来自applet的文件写入:
更新
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:
jar cvf localfile.jar localfile.java
jarsigner localfile.jar yourkey
html看起来像:
<applet code="localfile.class" archive="localfile.jar", width=300, height=600
&GT;
每次运行此applet时出现的错误是:
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/
有什么奇怪的:我创建了类似的小程序来读取文件,它可以正常工作。
有什么想法吗?
我在浏览器和applet查看器上运行此applet。什么是奇怪的给定applet不适用于applet viewer并抛出异常,但在浏览器上它很好。
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)
所以,除了这种奇怪的行为,我认为我的问题已经解决了。谢谢大家:)
答案 0 :(得分:2)
您是否提供了允许从文件系统中读取文件的策略?
似乎您只签署了jar但没有使用policytool。
答案 1 :(得分:1)
http://java.sun.com/docs/books/tutorial/security/tour1/step2.html
这可以帮助您创建策略文件并与代码库相关联
答案 2 :(得分:1)
通过一些指导,您可以在jar中包含策略文件。有关详细信息,请参阅SO问题jar policy file。
否则,请考虑创建一个Java WebStart应用程序,它可以更轻松地读/写文件。
答案 3 :(得分:1)
我知道这已经很晚了。但只是为了帮助那些查看此错误的人 -
使用Ant,可以一次签名多个jar,例如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}" />
这将签署目录中的所有jar。
答案 4 :(得分:0)
我相信您的问题是包含您尝试加载的文件的目录位于查找类文件和应用程序资源的代码库中。因此,您最终混合了受信任和不受信任的资源,这是不安全的。如果applet托管在http或更好的https服务器上,那么文件就不会出现问题。
请注意,您可以使用JNLP API让applet通过文件对话框“打开”或写入文件。
如果出现异常,您的资源处理会使文件保持打开状态。资源处理应该用以下样式编写:
Resource resource = acquire();
try {
use(resource);
} finally {
resource.release();
}
在您的具体案例中:
final FileOutputStream rawOut = new FileOutputStream(file);
try {
...
out.flush();
} finally {
rawOut.close();
}