8

私はレールとグレープ (api.domain.com) で書かれた API に接続する JS クライアント (app.domain.com) を持っています。CORS がセットアップされ、ログインが api.domain.com サーバーで実行されるため、2 つのドメイン間で共有 Cookie があります。

この JS アプリケーションは Spine.js を使用しているため、すべて CoffeeScript で記述されています。したがって、削除リクエストを送信するには、次を使用します。

    @item.destroy

これにより、DELETE リクエストが API に送信されます。ただし、Cookie はリクエスト ヘッダーと一緒に送信されないため、上記のコード行を次のように変更する必要がありました。

    $.ajax({
        url: "http://api.domain.com/tasks/" + @item.id,
        type: "DELETE",
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }
    })

そして、これは完全に機能します。Cookieが送信され、アクションが認証されるように、リクエストに沿ってレスポンスヘッダー「Access-Control-Allow-Credentials: true」が送信されます。

ただし、この方法では、リクエストごとにコード行を作成する必要があり、非常に時間がかかり、Spine フレームワークの利点も無効になります。

jQuery でデフォルトの ajax 設定を設定して、後続のすべての ajax 呼び出しでこれらの設定が使用されるようにすることが可能であることを私は知っています。だから私は試しました:

jQuery.ajaxSetup({
headers: {
    "X-Requested-With": "XMLHttpRequest",
    "Access-Control-Allow-Credentials": "true"
    }, crossDomain: true
});

基本的に、各 ajax 呼び出しに手動で設定するのと同じ設定です。ただし、このアプローチは機能しませんが、API に送信されたリクエストにこれらのヘッダーが含まれています (firebug を介して)。

何か不足していますか?

前もって感謝します!

ダブ

4

2 に答える 2

2

クライアント側アプリのブートストラップでこれを行います。

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
})

次に、サーバーは次の cors ヘッダーで応答する必要があります。

Access-Control-Allow-Credentials: true
于 2016-06-25T22:02:37.707 に答える
1

私は最近、非常によく似た問題を抱えており、これを行う2つの簡単な方法を見つけました。まず、呼び出しを行う Java スクリプト関数を作成します。つまり、次のようにします。

function delete (url){
   $.ajax({
        url: url,
        type: "DELETE",
        crossDomain: true,
        xhrFields: {
            withCredentials: true
        }
    })
}

または、複数のページで再利用する場合は、簡単に含めて再利用できる小さなクラスを作成することをお勧めします。これにより、デフォルト設定だけでなく、頻繁に使用される API 呼び出しの関数を作成することも可能になります。

于 2014-09-29T06:31:17.657 に答える