【问题标题】:Is it possible to access files beyond WEB-INF folder in dev mode of GAE (java.security.AccessControlException: access denied)?是否可以在 GAE 的开发模式下访问 WEB-INF 文件夹之外的文件(java.security.AccessControlException:访问被拒绝)?
【发布时间】:2012-01-21 02:24:37
【问题描述】:

是否可以访问 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)

【问题讨论】:

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


    【解决方案1】:

    根据GAE for Java Questions

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

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

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

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

    所以要回答您的问题,除了WEB-INF 目录之外,唯一可用于读取文件的位置是您在@987654326 中的<resource-files> 条目中指定的任何内容@。

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

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

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

    【讨论】:

    • 是的,我当然已经阅读了这个常见问题解答。有解决方法吗?我想知道为什么 gae-sqlite 可以工作。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多