是否可以在GAE的开发模式下访问WEB-INF文件夹之外的文件(java.security.AccessControlException:access denied)?

时间:2012-01-21 02:24:38

标签: google-app-engine access-denied file-access

是否可以访问Google App Engine开发服务器中WEB-INF文件夹以外的文件?也许我可以以某种方式强迫GAE开发服务器不阻止外部连接/文件访问?

我正在尝试创建gae-sqlite的Java版本。但由于access denied例外,我无法访问外部sql server(mysql或h2db)。

调用堆栈:

Caused by: java.security.AccessControlException: access denied (java.io.FilePermission C:\work\test_projects\gae_test\out\artifacts\gae_test_war_exploded\database.lock.db write)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:252)
    at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
    at java.io.File.createNewFile(File.java:882)
    at org.h2.store.fs.FilePathDisk.createFile(FilePathDisk.java:121)
    at org.h2.store.fs.FileUtils.createFile(FileUtils.java:59)
    at org.h2.store.FileLock.lockFile(FileLock.java:327)
    at org.h2.store.FileLock.lock(FileLock.java:128)
    at org.h2.engine.Database.open(Database.java:542)
    at org.h2.engine.Database.openDatabase(Database.java:222)

2 个答案:

答案 0 :(得分:0)

根据GAE for Java Questions

  

为什么我不能从这个文件中读取?

     

可以从作为您的一部分上传的文件中读取   应用程序提供它位于以下位置:

     
      
  • 战/ WEB-INF
  •   
  • 位于与<resource-files> appengine-web.xml模式匹配的位置(默认情况下包含所有内容)
  •   
     

如果文件位置不是问题,问题可能是   您用于从文件中读取的方法未列入白名单。您的   应用程序可以使用任何对读取有用的IO类   文件系统,例如File,FileInputStream,FileReader或   RandomAccessFile的。有关列入白名单的完整列表,请参阅   JRE班级白名单。如果您需要获取自己的文件访问权限   资源(如属性文件),你可以把这些文件放在里面   罐子并使用Class或ClassLoader加载它们。

所以回答你的问题,WEB-INF目录以外唯一可用于读取文件的地方是你在<resource-files>中指定的任何地方在appengine-web.xml中输入。

现在有一件事我注意到你正在尝试读取一个DB文件,如果你只考虑只读那就应该没问题。您无法写入任何“本地”文件,因为(来自同一链接):

  

为什么我不能写这个文件?

     

App Engine不支持写入本地文件   应用程序的分布式特性。相反,数据必须是   持久化应存储在分布式数据存储区中。更多   信息请参阅运行时沙箱上的文档。

答案 1 :(得分:0)

从GAE SDK 1.6.1开始,这是不可能的。如果你们以后找到了办法,请告诉我。