代码之家  ›  专栏  ›  技术社区  ›  wlk

Java小应用程序中的故障写入文件

  •  3
  • wlk  · 技术社区  · 15 年前

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

    每次运行此小程序时都会出现以下错误:

    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查看器并抛出异常,但在浏览器上它是正常的。

    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)
    

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

    5 回复  |  直到 14 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    最后,您可以在JAR中包含一个策略文件。参考销售订单问题 jar policy file 更多信息。

    否则,考虑制作一个Java WebScript应用程序,它可以更容易地读/写文件。

        2
  •  2
  •   Tobias P.    15 年前

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

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

        3
  •  1
  •   omarello    15 年前

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

    这将帮助您创建策略文件并与代码库关联。

        4
  •  1
  •   zawhtut    14 年前

    我知道这很晚了。但只是为了帮助那些发现这个错误的人-

    使用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进行签名。

        5
  •  0
  •   Tom Hawtin - tackline    15 年前

    我相信您的问题是,包含您试图加载的文件的目录在代码库中,在代码库中查找类文件和应用程序资源。因此,您最终会将受信任和不受信任的资源混合在一起,这是不安全的。如果小程序托管在HTTP或更好的HTTPS服务器上,则不会出现文件问题。

    注意,您可以使用JNLAPIsforapplet来“打开”或通过文件对话框写入文件。

    如果出现异常,资源处理将使文件保持打开状态。资源处理应采用以下样式:

    Resource resource = acquire();
    try {
         use(resource);
    } finally {
         resource.release();
    }
    

    在您的特定情况下:

    final FileOutputStream rawOut = new FileOutputStream(file);
    try {
        ...
        out.flush();
    } finally {
        rawOut.close();
    }