【问题标题】:JavaFX - Unable to access file system with signed appJavaFX - 无法使用签名的应用程序访问文件系统
【发布时间】:2012-08-09 11:39:13
【问题描述】:

我正在开发一个需要访问用户系统上文件的 JavaFX 应用程序。我知道我的应用程序必须先签名才能获得此类访问权限,所以我签署了我的应用程序。但应用程序仍然抛出 java.security.AccessControlException

-应用程序

public class TestApp extends Application
{
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) 
    {
         launch(args);
    }

    @Override
    public void start(Stage primaryStage) 
    {
         primaryStage.setTitle("Hello World!"); 
         StackPane root = new StackPane();
         primaryStage.setScene(new Scene(root, 300, 250));
         primaryStage.show();
    }

    public void callJSFunc(JSObject func) 
    {
         File fleExample = new File("F:/myfile.xml");
         func.call("call", fleExample.exists());
    }
}

然后我继续签署应用程序

keytool -genkey -keystore myKeyStore -alias me
keytool -selfcert -keystore myKeyStore -alias me  
jarsigner -keystore myKeyStore TestApp.jar me

所以我从 javascript 调用了应用程序 callJSFunc

function deployIt() 
{
      dtjava.embed(
      {
          id: "my2",
          url: "TestApp.jnlp",
          width: 300,
          height: 200,
          placeholder: "here"
       },
       { 
          javafx: "2.1+", 
           jvm: "1.6.0+" 
       },
       {
           onJavascriptReady: callApp
       });
}

function callApp(id) 
{
   var app = document.getElementById(id);
   app.callJSFunc(function(e){ alert(e); });
}

dtjava.addOnloadCallback(deployIt);

但是我的应用在浏览器上输出了这个

Uncaught Error: java.security.AccessControlException: access denied ("java.io.FilePermission" "F:/myfile.xml" "read") 

另外,我在本地主机上测试了该应用程序。我不明白为什么它在对应用程序进行签名后抛出此异常。请问我做错了什么?谢谢

【问题讨论】:

    标签: java security javafx-2


    【解决方案1】:

    不要使用 keytool 和 jarsigner 对应用进行签名。

    而是使用 javafx deployment tools(例如 javafxpackager 或 JavaFX ant 任务)打包、签名并准备好您的应用以进行部署。

    确保您的jnlp file requests elevated permissions.如果您使用的是 JavaFX ant 任务,则可以使用 fx:permissions 子句请求 JavaFX 生成具有提升权限的适当 jnlp。

    【讨论】:

      【解决方案2】:

      试试这个(使用 doPrivileged 块):

      public class TestApp extends Application
      {
          // ...
      
          public void callJSFunc(JSObject func) 
          {
               File fleExample = null;
               AccessController.doPrivileged(new PrivilegedAction() {
                  public Object run() {
                      fleExample = new File("F:/myfile.xml");
                      func.call("call", fleExample.exists());
                  }
               });
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 2018-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多