2012-08-09 71 views
1

我正在开发需要访问用户系统上的文件的JavaFX应用程序。我知道我的应用程序必须先签名才能拥有此类访问权限,所以我签署了我的应用程序。但应用程序仍引发java.security.AccessControlExceptionJavaFX - 无法使用已签名的应用程序访问文件系统

-The应用

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); 

但我的应用程序o在浏览器上使用了这个功能

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

另外,我测试了我的本地主机上的应用程序。我不明白为什么它在发布应用程序之后抛出这个异常。请问我做错了什么?由于

回答

1

试试这个(用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()); 
      } 
     }); 

    } 
} 
相关问题