0

MongoHQ に接続してドキュメントを取得するために、クライアント側の Sinatra から Sammy.js をテストしています。しかし、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 を読み込めません。Origin http:// localhost は Access-Control-Allow-Origin で許可されていません。

それを修正するために何をお勧めしますか?

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

http://localhost/json/test.json から実行するように、Apache サーバーで Passenger モジュールを設定することで解決しました。したがって、この場合、同じドメイン「localhost」を保持し、タイプ Cross Origin の制約を持つ必要はありません...ありがとう! :D

学んだこと: WEBrick の使用を避ける

于 2012-12-07T06:03:46.150 に答える