1

ユーザーシステム上のファイルにアクセスする必要がある 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") 

また、ローカルホストでアプリをテストしました。アプリをシグした後にこの例外をスローする理由がわかりません。私は何を間違っていますか?ありがとう

4

2 に答える 2

3

keytool と jarsigner を使用してアプリに署名しないでください。

代わりに、javafxpackager や JavaFX ant タスクなどのjavafx デプロイ ツールを使用して、アプリをパッケージ化し、署名し、デプロイできるようにします。

jnlp ファイルが権限の昇格を要求していることを確認してください。JavaFX ant タスクを使用している場合は、fx:permissions句を使用して、昇格された権限を持つ適切な jnlp を生成するように JavaFX に要求できます。

于 2012-08-09T18:50:28.493 に答える
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());
            }
         });

    }
}
于 2012-08-09T12:57:16.477 に答える