1

每当我尝试访问位于war/WEB_INF文件夹中的文件时,我都会遇到此问题。 我开始知道GAE使用码头和码头,我们需要在.policy文件中设置一些权限,但我无法找到该文件。这里是我的堆栈跟踪: -Google App Engine - java.security.AccessControlException?

java.security.AccessControlException: access denied (java.io.FilePermission /war/WEB_INF/mturktest.properties read) 
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:283) 
at java.lang.SecurityManager.checkRead(SecurityManager.java:871) 
at java.io.FileInputStream.<init>(FileInputStream.java:113) 
at com.amazonaws.mturk.util.PropertiesClientConfig.<init>(PropertiesClientConfig.java:96) 
at com.varundroid.testing.SiteCategory.<init>(SiteCategory.java:51) 
at com.varundroid.testing.MTurkProjectServlet.doGet(MTurkProjectServlet.java:12) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:370) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

有什么额外的我需要执行前。在appengine-web.xml中添加一些行以使GAE读取该文件?

任何帮助将非常感激。

谢谢。

+0

您是否可以控制打开FileInputStream的代码或将它隐藏在第三方代码中? –

+0

@JoachimIsaksson是的,现在我有。这是一个名为Amazon mturk java sdk的第三方库。我解压缩了SDK的jar文件,以检查代码中是否有错误。但没有错。所有SDK都使用普通的java.io来读取文件。 – Varundroid

+0

我需要一个File对象才能使用GoogleCredential.Builder()。setServiceAccountPrivateKeyFromP12File(xxxx)。 InputStream不能解决我的问题。当我运行\t \t System.out.println(新文件(“/ home/andre/xx-privatekey.p12”)。exists())作为独立代码时,它运行良好。当我在Jetty(GAE)服务器中运行相同的代码时,它会如上所述拒绝访问。我该如何解决?这个政策档案在哪里? –

回答

0

如果您有权访问打开文件的代码,那么GAE最简单的方法就是将它移动到WEB-INF/classes并使用getResourceAsStream来获得InputStream;

this.getClass().getClassLoader().getResourceAsStream("/mturktest.properties"); 

还有其他的选择using getRealPath() described here,可能会给你一个正确的路径文件I/O的工作,但我从来没有亲自测试与GAE测试他们让我知道他们的工作。