0

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

我正在尝试创建gae-sqlite的 Java 版本。access denied但由于异常,我无法访问外部 sql 服务器(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)
4

2 回答 2

0

根据GAE for Java Questions

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

可以从作为应用程序的一部分上传的文件中读取,前提是该文件位于以下位置:

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

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

因此,要回答您的问题,除了从中读取文件的WEB-INF目录之外,唯一可用的位置是您在.<resource-files>appengine-web.xml

现在我注意到的一件事是您正在尝试读取一个 DB 文件,如果您只考虑它read-only应该没问题。您不能写入任何“本地”文件,因为(来自同一链接):

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

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

于 2012-01-21T04:55:46.773 回答
0

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

于 2012-02-20T02:44:49.933 回答