JSのクロスドメイン原理と2つのソリューション_JavaScriptスキルの詳細説明

WBOY
リリース: 2016-05-16 15:26:52
オリジナル
1606 人が閲覧しました

1. クロスドメインとは

ページ上の他のサーバーにデータをリクエストするためによく ajax を使用します。このとき、クライアントでクロスドメインの問題が発生します。

クロスドメインの問題は、JavaScript 言語のセキュリティ制限の同一生成元ポリシーによって発生します。

簡単に言えば、同一生成元ポリシーとは、スクリプトが同じソースからのみウィンドウとドキュメントのプロパティを読み取ることができることを意味します。ここでの同じソースとは、ホスト名、プロトコル、ポート番号の組み合わせを指します。

例:

2. 実装原則

HTML DOM では、Script タグはドメインを越えてサーバー上のデータにアクセスできるため、スクリプトの src 属性をクロスドメイン URL として指定して、クロスドメイン アクセスを実現できます。

例:

このアクセス方法はできませんが、以下の方法は可能です。

返されるデータには要件があります。つまり、サーバーから返されるデータを単純に {"Name":"zhangsan"} にすることはできません

この json 文字列が返された場合、この文字列を参照する方法はありません。したがって、戻り値は

var json={"Name":"zhangsan"} または json({" である必要があります。名前":"張さん"})

プログラムがエラーを報告しないようにするには、

json 関数も作成する必要があります。

3. 解決策

オプション 1
サーバー側:

protected void Page_Load(object sender, EventArgs e)
  {
    string result = "callback({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

    Response.Clear();
    Response.Write(result);
    Response.End();
  }

ログイン後にコピー
クライアント:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">

    var result = null;
    window.onload = function () {
      var script = document.createElement("script");
      script.type = "text/javascript";
      script.src = "http://192.168.0.101/ExampleBusinessApplication.Web/web2.aspx";

      var head = document.getElementsByTagName("head")[0];
      head.insertBefore(script, head.firstChild);

    };

    function callback(data) {
      result = data;
    }

    function b_click() {
      alert(result.name);
    }
  </script>
</head>
<body>
  <input type="button" value="click me!" onclick="b_click();" />
</body>
</html>

ログイン後にコピー

オプション 2: jquery を介して完了

jquery の jsonp メソッドを使用します。このメソッドの使用にはサーバー側の要件があります。

サーバー側は次のとおりです:

  protected void Page_Load(object sender, EventArgs e)
  {
    string callback = Request.QueryString["jsoncallback"];

    string result = callback + "({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";

    Response.Clear();
    Response.Write(result);
    Response.End();
  }

ログイン後にコピー
クライアント:

$.ajax({ 
        async: false, 
        url: "http://192.168.0.5/Web/web1.aspx", 
        type: "GET", 
        dataType: 'jsonp', 
        //jsonp的值自定义,如果使用jsoncallback,那么服务器端,要返回一个jsoncallback的值对应的对象. 
        jsonp: 'jsoncallback', 
        //要传递的参数,没有传参时,也一定要写上 
         data: null, 
        timeout: 5000, 
        //返回Json类型 
         contentType: "application/json;utf-8", 
        //服务器段返回的对象包含name,data属性. 
        success: function (result) { 
          alert(result.date); 
        }, 
        error: function (jqXHR, textStatus, errorThrown) { 
          alert(textStatus); 
        } 
      });
ログイン後にコピー
実際、この js を実行すると、js は次のようなリクエストをサーバーに送信します。

http://192.168.0.5/Web/web1.aspx?jsoncallback=jsonp1354505244726&_=1354505244742

サーバーはそれに応じて次のオブジェクトも返しました:

jsonp1354506338864({"name":"zhangsan","date":"2012-12-03"})

この時点で、クロスドメイン サンプル データの要件が実現されます。

上記は、js のクロスドメインの原理と 2 つの解決策の紹介です。クロスドメインの知識ポイントを学習する際に役立つことを願っています。また、学習や研究のために他の関連記事と組み合わせることもできます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート