从Clojure调用的App Engine URLFetch服务提供了AccessControlException

时间:2012-04-10 19:56:28

标签: java google-app-engine ssl clojure

我正在尝试在Clojure中构建一个简单的Web小部件,该小部件应该获取Picasa源,从那里检索缩略图URL,并返回将插入到页面中的HTML(使用JQuery AJAX调用)。 Picasa Feed有一个https:// ... url。 当我使用mvn jetty在本地Jetty实例中运行它时,一切正常:run;但是当我尝试在本地GAE实例(mvn gae:run)中运行时,它失败并出现AccessControlException。 我已经阅读了GAE文档,但是这表明对于Java中的URLFetch,应该只使用普通的Java URLConnection类,Google将提供自己的实现。据我所知,我正在跟随他们的例子,只使用Clojure / Java互操作。

Google示例代码如下所示:

import java.net.URL;
// (other imports omitted)
try {
    URL url = new URL("http://www.example.com/atom.xml");
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        // ...
    }

有趣的是,这是直接在URL上调用openStream,尽管其他文档提到使用UrlConnection。我试过了两个,但结果是一样的。 我的相应Clojure代码,使用openConnection:

  (if (.startsWith str-url "https://picasaweb.google.com")
    (let [feed-url (java.net.URL. str-url)
          connection (.openConnection feed-url)
          xmltags (xml-seq (parse (.openStream connection)))]
  ; ... 

当我在GAE中运行时,我得到以下堆栈跟踪(截断)

java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at     sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    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:122)

最后在底部:

Caused by: java.security.AccessControlException: access denied     (java.security.SecurityPermission getProperty.ssl.KeyManagerFactory.algorithm)
    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.security.Security.getProperty(Security.java:725)
    at org.eclipse.jetty.util.ssl.SslContextFactory.<clinit>(SslContextFactory.java:92)
    ... 74 more

我一直在谷歌搜索我是否应该在appengine-web.xml或其他地方添加任何设置,但我什么都没看到。我读到的一切都告诉我这应该“正常工作”,但事实并非如此。 任何建议都是最受欢迎的;如果需要,我可以发布完整的源代码或完整的堆栈跟踪,虽然我认为上面几乎是相关的部分。

1 个答案:

答案 0 :(得分:0)

openStream()openConnection().getInputStream()的简写,其中openConnection()返回URLConnection