ホームページ >ウェブフロントエンド >jsチュートリアル >クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介

クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介

不言
不言転載
2018-10-22 13:54:1313035ブラウズ

この記事では、PHP シナジーの実装について詳しく説明します (コード付き)。必要な方は参考にしていただければ幸いです。

#1. クロスドメインとは

クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介

##JavaScript セキュリティ上の理由から、クロスドメイン他のページからのオブジェクトへの呼び出しは許可されません。では、クロスドメインとは何でしょうか? 簡単に理解すると、JavaScript の同一オリジン ポリシーの制限により、ドメイン名 a.com の js はドメイン名 b.com または c.a.com のオブジェクトを操作できません。

プロトコル、サブドメイン名、メインドメイン名、ポート番号のいずれかが異なる場合は、すべて異なるドメインとしてカウントされます。異なるドメインからのリソースの要求は「クロスドメイン」とみなされます。

例: http://www.abc.com/index.html は http://www.efg.com/service.php をリクエストします。


注意すべき点が 1 つあります:
クロスドメインとは、リクエストを送信できないことを意味するのではなく、リクエストは送信でき、サーバーはリクエストを受信して​​通常どおり結果を返すことができますが、結果はブラウザ

によってインターセプトされます。これがドメイン間で発生する理由は、同一オリジン ポリシーによって制限されているためです。同一オリジン ポリシーでは、通常の通信ではソースが同じであること、つまりプロトコル、ドメイン名、ポート番号がすべて正確であることが必要です。同じ。

クロスドメインについて詳しく理解するには、下の図を参照してください。

クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介2 つの点に関する特別な注意事項:

最初に: プロトコルとポートが原因でクロスドメインの問題が発生した場合、「フロント』は無力です。

2つ目: クロスドメインの問題に関しては、ドメインは「URLのヘッダー」によってのみ識別され、ドメイン名に対応するIPアドレスが同じかどうかによって判断されることはありません。 「URL のヘッダー」は、「プロトコル、ドメイン名、ポートが一致する必要がある」と理解できます。

2. 同一生成元ポリシーとその制限とは

同一生成元ポリシーは、あるソースからロードされたドキュメントまたはスクリプトが別のソースからのリソースと対話する方法を制限します。 。これは、潜在的に悪意のあるファイルを隔離するための重要なセキュリティ メカニズムです。この存在により、ユーザーのプライバシー情報が保護され、個人情報の偽造などが防止されます (Cookie を参照)。

同一生成元ポリシーによって制限されるコンテンツには、次のものが含まれます:

Cookie、LocalStorage、IndexedDB、およびその他のストレージ コンテンツ
  • DOM node
  • AJAX リクエストは送信できません
  • ただし、リソースのクロスドメイン読み込みを可能にする 3 つのタグがあります:

1.<img  alt="クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介" >
2.<link>
3.<script></script>
次に、クロスドメインを処理するいくつかの方法について説明します。ただし、すべてのクロスドメイントランザクションは情報プロバイダーによって承認される必要があります。許可なく取得できる場合は、ブラウザの同一生成元ポリシーの脆弱性となります。

3. クロスドメイン処理方法 1 - JSONP

1.JSONP の原則

利用

要素のこのオープン ポリシーを使用すると、Web ページは他のソースから動的に生成された JSON データを取得できます。 JSONP リクエストは相手のサーバーでサポートされている必要があります。 2. JSONP と AJAX の比較

JSONP と AJAX は、クライアントがサーバーにリクエストを送信し、サーバーからデータを取得する方法は同じです。ただし、AJAX は同一オリジン ポリシーに属し、JSONP は非オリジナル ポリシー (クロスドメイン リクエスト) に属します。

3 JSONP の利点と欠点

JSONP の利点は次のとおりです。は互換性が高く、主流ブラウザのクロスオリジン問題を解決するために使用できます。

欠点は、get メソッドのサポートのみに制限があることです。

4.JSONP プロセス (サードパーティ API アドレスを例として取り上げます。バックグラウンド プログラムを考慮する必要はありません)

コールバックを宣言します。 function の場合、その関数名 (fn など) は、クロスドメイン データを要求するサーバーに渡されるパラメーター値として使用され、ターゲット データ (サーバーから返されるデータ) を取得します。
  • <script><li> タグを作成し、クロスドメイン API データ インターフェイスのアドレスをスクリプトの src に割り当て、さらにこのアドレスでサーバーをリクエストします。関数名を渡します (パラメーターは疑問符:?callback=fn を使用して渡すことができます)。 <p><code>サーバーはリクエストを受信した後、特別な処理を実行する必要があります。渡された関数名と、提供する必要のあるデータを文字列に連結します。次に例を示します。渡される関数名は fn で、関数が用意するデータは fn([{"name":"jianshu"}]) です。 <ul style="list-style-type: square;" class=" list-paddingleft-2"><li><p>最後に、サーバーは準備されたデータを HTTP プロトコルを通じてクライアントに返し、クライアントは以前に宣言されたコールバック関数 (fn) を呼び出して実行して、返されたデータ。 </script>
  • <script>
        function fn(data) {
            alert(data.msg);
        }
    </script>
    <script></script>
    ここで、fn はクライアントによって登録されたコールバック関数です。その目的は、クロスドメイン サーバー上の json データを取得し、データを処理することです。
  • サーバーからクライアントに返されるデータの最終形式は次のとおりです。
    fn({ msg:'this  is  json  data'})

    5.jQuery の jsonp 形式

    JSONP は GET および非同期リクエストであり、次のようなものがあります。他のメソッドと同期リクエストは存在せず、jQuery はデフォルトで JSONP リクエストのキャッシュをクリアします。

    $.ajax({
    url:"http://crossdomain.com/jsonServerResponse",
    dataType:"jsonp",
    type:"get",//可以省略
    jsonpCallback:"fn",//->自定义传递给服务器的函数名,而不是使用jQuery自动生成的,可省略
    jsonp:"jsonp",//->把传递函数名的那个形参callback变为jsonp,可省略
    success:function (data){
    console.log(data);}
    });
    4. クロスドメイン処理方法 2 - CORS

    1.CORS原理

    整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信

    2.CORS优缺点

    CORS要求浏览器(>IE10)和服务器的同时支持,是跨域的根本解决方法,由浏览器自动完成
    优点在于功能更加强大支持各种HTTP Method,缺点是兼容性不如JSONP。
    只需要在服务器端做一些小小的改造即可:

    header("Access-Control-Allow-Origin:*");
    header("Access-Control-Allow-Methods:POST,GET");

    例如:网站http://localhost:63342/ 页面要请求http://localhost:3000/users/userlist  页面,userlist页面返回json字符串格{name: 'Mr.Cao', gender: 'male', career: 'IT Education'}

    //在服务器端设置同源策略地址
    router.get("/userlist", function (req, res, next) {   
        var user = {name: 'Mr.Cao', gender: 'male', career: 'IT Education'};  
        res.writeHeader(200,{"Access-Control-Allow-Origin":'http://localhost:63342'});  
        res.write(JSON.stringify(user));  
        res.end();  
    });

    在响应头上添加Access-Control-Allow-Origin属性,指定同源策略的地址。同源策略默认地址是网页的本身。只要浏览器检测到响应头带上了CORS,并且允许的源包括了本网站,那么就不会拦截请求响应

    クロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介

    五、处理跨域方法三——WebSocket

    Websocket是HTML5的一个持久化的协议,它实现了浏览器与服务器的全双工通信,同时也是跨域的一种解决方案。WebSocket和HTTP都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或接收数据。同时,WebSocket 在建立连接时需要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。

    原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

    //前端代码:
    <p>user input:<input></p>
    <script></script>
    <script>
    var socket = io(&#39;http://www.domain2.com:8080&#39;);
    // 连接成功处理
    socket.on(&#39;connect&#39;, function() {
        // 监听服务端消息
        socket.on(&#39;message&#39;, function(msg) {
            console.log(&#39;data from server: ---> &#39; + msg); 
        });
    
     // 监听服务端关闭
        socket.on(&#39;disconnect&#39;, function() { 
            console.log(&#39;Server socket has closed.&#39;); 
        });
    });
    document.getElementsByTagName(&#39;input&#39;)[0].onblur = function() {
        socket.send(this.value);
    };
    </script>
    //Nodejs socket后台:
    var http = require('http');
    var socket = require('socket.io');
    // 启http服务
    var server = http.createServer(function(req, res) {
        res.writeHead(200, {
            'Content-type': 'text/html'
        });
        res.end();
    });
    server.listen('8080');
    console.log('Server is running at port 8080...');
    // 监听socket连接
    socket.listen(server).on('connection', function(client) {
        // 接收信息
        client.on('message', function(msg) {
            client.send('hello:' + msg);
            console.log('data from client: ---> ' + msg);
        });
    
        // 断开处理
        client.on('disconnect', function() {
            console.log('Client socket has closed.'); 
        });
    });

    六、处理跨域方法四——postMessage

    如果两个网页不同源,就无法拿到对方的DOM。典型的例子是iframe窗口和window.open方法打开的窗口,它们与父窗口无法通信。HTML5为了解决这个问题,引入了一个全新的API:跨文档通信 API(Cross-document messaging)。这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即"协议 + 域名 + 端口"。也可以设为*,表示不限制域名,向所有窗口发送。

    接下来我们看个例子:
    http://localhost:63342/index.html页面向http://localhost:3000/message.html传递“跨域请求信息”

    //发送信息页面 http://localhost:63342/index.html
      
      
        <meta>  
        <title>跨域请求</title>   
      
      
        <iframe></iframe>  
        <input>  
      
      
    <script>  
       function  run(){  
            var frm=document.getElementById("frm");  
            frm.contentWindow.postMessage("跨域请求信息","http://localhost:3000");  
       }  
    </script>
    //接收信息页面 http://localhost:3000/message.html
     window.addEventListener("message",function(e){  //通过监听message事件,可以监听对方发送的消息。
      console.log(e.data);  
    },false);

    以上がクロスドメインとは何ですか?クロスドメイン JavaScript の 4 つの方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。