0

我正在从客户端 Sinatra 测试 Sammy.js 以连接到 MongoHQ 并检索文档。但是,我对 Sammy.js 的检索有疑问。我的代码如下所示:

this.get('#/', function(context) {

  this.load('http://localhost:4567/test.json', { cache: false })
      .then(function(items) {
        context.items = items;
      })
      .partial('templates/index.ms');

});

XMLHttpRequest 无法加载 http://localhost:4567/test.json。Access-Control-Allow-Origin 不允许 Origin http:// localhost。

你有什么建议修复它?

4

3 回答 3

1

由于跨域资源共享,您的 XMLHTTPRequest 被阻止。

要了解更多信息,您应该查看关于 CORS 的维基百科文章

要了解如何在服务器端实现它,请查看enable-cors.org

不幸的是,他们在 enable-cors.org 上没有 Ruby 版本(我现在正在处理一个拉取请求),同时你可以在任何基于机架的服务器上使用这样的东西:

class CORSController < ActionController::Base

  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Max-Age'] = "1728000"
  end

  def cors_preflight_check
    if request.method == "OPTIONS"
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
      headers['Access-Control-Allow-Headers'] = 'X-Requested-With'
      headers['Access-Control-Max-Age'] = '1728000'
      render :text => '', :content_type => 'text/plain'
    end
  end

end

编辑:

我应该补充一点,任何从 CORSController 继承的类都将允许 CORS 请求,如果您希望全局使用 CORS,您应该将其添加到您的 ApplicationController。

此外,将Access-Control-Allow-Origin设置为通配符是潜在的安全风险。

于 2012-12-06T20:26:17.387 回答
0

我已经解决了它在 Apache 服务器中设置乘客模块,从 http://localhost/json/test.json 运行。因此,在这种情况下,保持相同的域“localhost”,不需要有跨域类型的约束......谢谢!:D

我学会了:避免使用WEBrick

于 2012-12-07T06:03:46.150 回答
0

我不知道我为什么问这个问题,为什么仍然没有得到回答。

this.get('#/', function(context) {

  context.load('http://...', { dataType: 'jsonp' })
      .then(function(items) {
        context.items = items;
      })
      .partial('templates/index.ms');

});

只需将数据类型添加到 json 填充。

于 2013-07-06T08:33:31.313 回答