JavaFX - 无法使用已签名的应用程序访问文件系统
问题描述:
我正在开发需要访问用户系统上的文件的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
的应用 callJSFuncfunction 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")
另外,我测试了我的本地主机上的应用程序。我不明白为什么它在发布应用程序之后抛出这个异常。请问我做错了什么?由于
答
不要使用keytool和的jarsigner签名的应用程序。
请使用javafx deployment tools(如javafxpackager或JavaFX ant任务)打包,签名并准备好应用以进行部署。
请确保您的jnlp file requests elevated permissions。如果您正在使用JavaFX ant任务,则可以使用fx:permissions子句请求JavaFX以提升的权限生成适当的jnlp。
答
试试这个(用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());
}
});
}
}