【问题标题】:Accessing Google App Engine datastore using JSON and JavaScript使用 JSON 和 JavaScript 访问 Google App Engine 数据存储
【发布时间】:2013-12-13 15:34:40
【问题描述】:

我正在尝试使用 JSON 从应用引擎数据存储中获取数据并将其发送到 JavaScript 代码,但我制作的 JSON 似乎不支持 JSONP,因此无法检索。我正在使用 Java 和 Gson 来制作 JSON。

Java 代码:

public class outputServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Query query = new Query("smsgateway");
    List<Entity> from = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));
    for (Entity sms : from){
            sms.getProperty("user");
            sms.getProperty("date");
            sms.getProperty("content"); 
        }

        Gson gson = new Gson();
        String json = gson.toJson(from);
        resp.setContentType("application/json");
        resp.getWriter().print(json);

    }
}

我在这段代码中有什么错误吗?还是有其他方法可以制作可访问的 JSON?

--edited: 从上面的代码中我得到了这个 JSON 数组:

[{"key":{"parentKey":{"kind":"user","id":0,"name":"test 1"},"kind":"smsgateway","id":5707702298738688},"propertyMap":{"content":"test content1","date":"Dec 12, 2013 2:58:57 PM","user":"test 1"}}]

【问题讨论】:

  • 您在响应中究竟得到了什么?
  • JSONP 涉及将返回的 JSON 包装到方法调用中,方法名称由调用页面提供——您的代码不会这样做。你目前如何调用这个servlet,即回调参数的名称是什么?
  • 另外,你真的需要使用 JSONP 吗?这不是从远程服务器访问 JSON 的最安全方式。如果您从中调用此 servlet 的页面运行在与 servlet 相同的 host:port 上,则可以直接访问 JSON,无需 JSONP。
  • @PhilippReichart:感谢您的回复。在部署到 GAE 后,我需要将此 json 用于其他 Web 应用程序,所以基本上我将在 javascript 端使用 jsonp。但是由于访问控制问题,可以使用这个 json。我应该怎么办?我刚学了 1 个月,所以举例说明对我很有帮助。

标签: java javascript json google-app-engine


【解决方案1】:

以下是如何更改代码以执行 JSONP,方法是将返回的 JSON 包装在 Javascript 方法调用中,并使用调用页面提供的方法名称:

Gson gson = new Gson();
String json = gson.toJson(from);
String callback = req.getParameter("callback");

resp.setContentType("application/json");
resp.getWriter().println(callback + "(" + json + ");");

这需要使用名为callback 的参数调用您的servlet,该参数包含您希望在调用页面中接收JSON 的函数的名称。您可以手动执行此操作(见下文),也可以使用 jQuery 等框架。

假设您的 json[1, 2, 3] 并且您以 http://yourhost/yourservlet?callback=doStuff 调用 servlet,这将是它的输出:

doStuff([1, 2, 3]);

这是一个最小的手动示例,它使用上述 Java 代码并调用名为 doStuff() 的 Javascript 方法,其中 JSON 通过 JSONP 从服务器获取:

<script type="text/javascript">
  function doStuff(json) {
    // Do stuff with JSON received from server.
  }
</script>
<script type="text/javascript"
        src="http://yourhost/yourservlet?callback=doStuff"></script>

关于 JSONP 的安全性

服务器和客户端都有security concerns surrounding JSONP

客户端必须完全信任服务器,因为服务器可以通过 JSONP 的工作原理inject any kind of executable code 进入页面。恶意 JSONP 服务器可以窃取 cookie、登录凭据和调用站点上显示的任何内容,或将用户暴露给恶意软件。

服务器无法轻松验证 JSONP 请求是否合法或由XSRF 触发。因此,仅将 JSONP 用于公共数据 - 不要将其用于需要身份验证/登录、不应暴露给第三方或其他敏感的数据。

如果这是学习练习或家庭作业,请不要太担心。如果您打算在网络上实际运行 JSONP,请重新考虑。

如需更安全的跨域 AJAX 调用方法,请查看CORS。对于“向所有人提供公共数据”的简单情况,只需在响应中设置一个标头即可:Access-Control-Allow-Origin: *。对于其他任何事情(非公开数据,仅提供给某些主机,通过 POST 接受数据),它很快就会变成一件复杂的事情。

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 2014-06-13
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多