4

JavaScriptは、別のサーバー上にあるデータベースと対話できますか?

つまり、3台のコンピューターが関係しています

  • サーバー:JavaScriptを使用してHTMLページを提供します
  • クライアント:話したいページを実行します
  • 2番目のサーバー:クライアントとの間でデータを送受信します

これは同一生成元ポリシーに違反しますか?そうでない場合はどうしてですか?もしそうなら、それを回避する方法はありますか?

私の経歴-私は有能なコンピューター科学者ですが、クライアントサイドプログラミングを扱ったことがありません。答えるときは、複雑なアイデアを自由に使用してください。ただし、JavaScript言語や、クライアント側プログラミングの背後にある特定のポリシーについては何も知らないと思います。

4

3 に答える 3

4

HTMLがサーバー1から送信され、AJAXリクエストがサーバー2に送信される場合は常に、同一生成元に違反します。

クロスオリジンリソースシェアリングをご覧ください。これは、まさにこの状況を処理するために設計された標準です。最近のほとんどのブラウザに実装されています。

または、 JSONPを使用してデータを提供するか、2番目のサーバーを制御できない場合は、リバースプロキシを使用して、最初のサーバーを介して2番目のサーバーにリクエストをプロキシします。

于 2012-07-04T23:47:03.620 に答える
3

はい、これはSOPに違反しています。それを回避する方法はいくつかありますが、重要なポイントを強調する価値があります。

クライアントからリモートサーバーにアクセスしようとすると、そのサーバー側で共犯が必要になります。

では、オプションは何ですか?

JSON-P

JSON-Pでは、サーバーが呼び出しでラップされた応答をコールバック関数に返す必要があります。それはこのように動作します:

  • 新しいスクリプトタグがページにDOMスクリプト化されるか、既存のタグが再利用されます
  • スクリプトタグのsrc属性はリクエストパスとして設定されます(スクリプトタグはどこからでもスクリプトをロードできます-SOPの対象ではありません)
  • 多くの場合(必ずしもではありませんが)JSONとしてエンコードされたデータを含むサーバー応答。これは、コールバック関数(JSで定義する必要があります)の呼び出しに対する引数として出力されます。

したがって、ネイティブJSで記述されたJSON-Pリクエストは、次のようになります。

callback = function(response) { console.log(response); };
var script = document.createElement('script');
script.src = 'http://www.some-request.com/here.php?callback=callback'; //the example happens to use the same name; the callback parameter tells the some-request domain what function to wrap JSON in 
document.body.appendChild(script);

次に、サーバーの応答が

callback({"foo": "bar"});

...コンソールに応答が表示されます。関数はアクセス可能であり、スコープによって非表示にされてはならないため、明示的にグローバルにすることに注意してください。(この意味では、グローバルにアクセス可能である必要がありますが、従来の意味では必ずしもグローバルである必要はありません。たとえば、グローバル名前空間の静的メソッドである可能性があります)。

多くのJSON-P準拠のWebサーバーでは、通常、この情報をリクエストURLに追加することで、呼び出す関数の名前を指定できます&callback=func_name

これに関する詳細はこちら

CORS / XHR2

CORSでは、XHR(つまり、AJAX)v2の背後にあるクロスドメインの考え方で、これは、サーバーがクロスドメインリクエストを行う可能性のあるドメイン(またはすべてのドメイン)を示すヘッダーを送信することを意味します。たとえば、PHPでは、すべての呼び出し元ドメインが次のように要求を行うことを許可できます。

header("Access-Control-Allow-Origin: *");

これに関する詳細はこちら

EasyXDM *

EasyXDMは、ドメイン間でテキストベースのメッセージを投稿および受信するためのベンダー固有の新しいHTML5到着手段の数を照合し、一見の価値があります。

非JS

ボールを再生しないサーバーから何かを取得する必要がある場合、唯一のオプションは中間サーバー側スクリプトです。これらは、SOPの制限なしにリモートリソースをスクレイプできるcURL要求を発生させる可能性があるためです。

$curl = curl_init("http://www.example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);

cURLの詳細はこちら

于 2012-07-05T00:42:11.360 に答える
1

はい、これは同一生成元ポリシーに違反しています。

この制限を回避するには、タグの動作を利用して2番目の(データベース)ホストからデータを取得するJSONPを使用します。scriptこれは、JSON応答をコールバックでラップするという非常に特殊な方法で2番目のホストからデータを提供できることを前提としています。また、応答を提供するためにGETを使用する必要があります。

別の方法はCORSです。これは、サーバーがデータを送信する方法をある程度制御する必要があり、最新のWebブラウザーに制限されます。

于 2012-07-04T23:46:18.917 に答える