繁体   English   中英

无法在java applet中编写文件

[英]Trouble writing file from within a java applet

我创建了简单的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 >

我每次运行这个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不适用于applet查看器并抛出异常,但在浏览器上它是好的。

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)

所以,除了这种奇怪的行为,我认为我的问题已经解决 感谢大家:)

您是否提供了允许从文件系统读取文件的策略?

似乎你只签署了jar但没有使用policytool。

http://java.sun.com/docs/books/tutorial/security/tour1/step2.html

这可以帮助您创建策略文件并与您的代码库相关联

通过一些finagling,您可以在jar中包含策略文件。 有关更多信息,请参阅SO问题jar策略文件

否则,请考虑创建一个Java WebStart应用程序,它可以更轻松地读/写文件。

我知道这已经很晚了。 但只是为了帮助那些查看此错误的人 -

使用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。

我相信您的问题是包含您尝试加载的文件的目录位于查找类文件和应用程序资源的代码库中。 因此,您最终混合了受信任和不受信任的资源,这是不安全的。 如果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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM