Rumah >hujung hadapan web >tutorial js >Pelbagai cara untuk mencapai kemahiran js_javascript merentas domain

Pelbagai cara untuk mencapai kemahiran js_javascript merentas domain

WBOY
WBOYasal
2016-05-16 15:23:341088semak imbas

Mulakan dengan domain

Domain: Domain ialah sempadan keselamatan sistem rangkaian WIN2K. Kami tahu bahawa unit paling asas bagi rangkaian komputer ialah "domain". Ini bukan unik untuk WIN2K, tetapi Active Directory boleh dijalankan melalui satu atau lebih domain. Pada komputer bebas, domain merujuk kepada komputer itu sendiri Sebuah domain boleh diedarkan di beberapa lokasi fizikal Pada masa yang sama, lokasi fizikal boleh dibahagikan kepada segmen rangkaian yang berbeza ke dalam domain yang berbeza hubungannya dengan hubungan Amanah dengan domain lain. Apabila berbilang domain disambungkan melalui perhubungan kepercayaan, Active Directory boleh dikongsi oleh berbilang domain amanah
Pokok domain: Pokok domain terdiri daripada berbilang domain yang berkongsi struktur dan konfigurasi jadual yang sama untuk membentuk ruang nama berterusan. Domain dalam pepohon disambungkan melalui perhubungan kepercayaan dan Active Directory mengandungi satu atau lebih pepohon domain. Domain dalam pepohon domain disambungkan melalui hubungan kepercayaan transitif dua arah. Oleh kerana hubungan kepercayaan ini adalah dua hala dan transitif, domain yang baru dibuat dalam pokok domain atau hutan boleh segera mewujudkan hubungan amanah dengan setiap domain lain dalam pokok domain atau hutan. Perhubungan kepercayaan ini membenarkan proses log masuk tunggal yang mengesahkan pengguna merentas semua domain dalam pepohon domain atau hutan, tetapi ini tidak semestinya bermakna pengguna yang disahkan mempunyai hak dan kebenaran yang sama merentas semua domain dalam pepohon domain. Oleh kerana domain adalah sempadan keselamatan, pengguna mesti diberikan hak dan kebenaran yang sesuai berdasarkan setiap domain.
Semakin dalam tahap domain dalam pepohon domain, semakin rendah tahap A "."
Sebagai contoh, domain zhidao.baidu.com (dikenali oleh Baidu) berada pada tahap yang lebih rendah daripada domain baidu.com (Baidu) kerana ia mempunyai dua tahap hubungan, manakala baidu.com hanya mempunyai satu tahap.

Apakah itu domain silang

Secara lalai, objek XHR hanya boleh mengakses sumber yang berada dalam domain yang sama dengan halaman yang mengandunginya. Strategi keselamatan ini boleh menghalang tingkah laku berniat jahat tertentu. Walau bagaimanapun, melaksanakan permintaan silang asal yang munasabah juga penting untuk membangunkan aplikasi penyemak imbas tertentu.
Selagi protokol, nama domain atau port berbeza, ia akan dianggap sebagai domain yang berbeza

Sebagai contoh, hantar permintaan ajax ke halaman berikut pada halaman http://www.a.com/a.js Berikut ialah hasil permintaan dan penerangan

Perbezaan dalam port dan protokol hanya boleh diselesaikan melalui latar belakang. Apa yang ingin kami selesaikan ialah masalah nama domain yang berbeza

Cara merentas domain

(1) CORS (Perkongsian Sumber Silang Asal, perkongsian sumber silang asal)

1.CORS (Cross-Origin Resource Sharing) ialah draf kerja W3C yang mentakrifkan cara penyemak imbas dan pelayan harus berkomunikasi apabila sumber silang asal mesti diakses. Idea asas di sebalik CORS ialah menggunakan pengepala HTTP tersuai untuk membolehkan penyemak imbas berkomunikasi dengan pelayan untuk menentukan sama ada permintaan atau respons harus berjaya atau gagal.
2. Melaksanakan ciri ini adalah sangat mudah, hanya menghantar pengepala respons oleh pelayan.

Sokongan penyemak imbas:

  • IE 8
  • Firefox 3.5
  • Opera 12
  • Safari 4
  • Chrome 3

Andaikan halaman atau aplikasi kami sudah ada di http://www.a.com/, dan kami merancang untuk meminta pengekstrakan data daripada http://www.b.com. Biasanya, jika kami menggunakan AJAX secara langsung untuk meminta, permintaan akan gagal dan penyemak imbas akan mengembalikan ralat.
Dengan CORS, http://www.b.com boleh membenarkan permintaan daripada http://www.a.com dengan hanya menambah pengepala.
Berikut ialah tetapan menggunakan php. Tanda "*" menunjukkan bahawa mana-mana domain dibenarkan untuk menghantar permintaan ke pelayan kami:

header{"Access-Control-Allow-Origin: *"}

Cara menulis keserasian CORS

 function createCORSRequest(method, url){
 var xhr = new XMLHttpRequest();
 //非IE浏览器
 if ("withCredentials" in xhr){
 xhr.open(method, url, true);
 //IE浏览器
 } else if (typeof XDomainRequest != "undefined"){
 vxhr = new XDomainRequest();
 xhr.open(method, url);
 } else {
 xhr = null;
 }
 return xhr;
 }
 var request = createCORSRequest("get", "http://www.somewhere-else.com/page/");
 if (request){
 request.onload = function(){
 //对request.responseText 进行处理
 };
 request.send();
 }

(2) JSONP (JSON dengan Padding diisi JSON atau JSON berparameter)

Dalam js, walaupun kami tidak boleh menggunakan XMLHttpRequest secara langsung untuk meminta data pada domain yang berbeza, adalah mungkin untuk memperkenalkan fail skrip js pada domain yang berbeza pada halaman menggunakan ciri ini untuk mencapai

ini

JSONP terdiri daripada dua bahagian: fungsi panggil balik dan data. Fungsi panggil balik ialah fungsi yang harus dipanggil dalam halaman apabila respons datang, dan data ialah data JSON yang dihantar ke fungsi panggil balik.

Contohnya:

<script type="text/javascript">
 function dosomething(jsondata){
 //处理获得的json数据
 }
</script>
<script src="http://example.com/data.php&#63;callback=dosomething"></script>

首先第一个script便签定义了一个处理数据的函数;
然后第二个script标签载入一个js文件,http://example.com/data.php 是数据所在地址,但是因为是当做js来引入的,所以http://example.com/data.php 返回的必须是一个能执行的js文件;
最后js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以php应该是这样的

<&#63;php
$callback = $_GET['callback'];//得到回调函数名
$data = array('a','b','c');//要返回的数据
echo $callback.'('.json_encode($data).')';//输出
&#63;>

最终,输出结果为:dosomething(['a','b','c']);
从上面可以看出jsonp是需要服务器端的页面进行相应的配合的。

JSONP的优缺点
优点:

它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;
能够直接访问响应文本,支持在浏览器与服务器之间双向通信
缺点:

JSONP 是从其他域中加载代码执行。如果其他域不安全,很可能会在响应中夹带一些恶意代码,而此时除了完全放弃JSONP 调用之外,没有办法追究。因此在使用不是你自己运维的Web 服务时,一定得保证它安全可靠。
它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
(三) window.name

window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。

这里有三个页面:

a.com/app.html:应用页面。
a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面在同一域下。
b.com/data.html:应用页面需要获取数据的页面,可称为数据页面。

app.html

<iframe src="b.com/data.html" id="iframe"></iframe>
<script>
 var iframe = document.getElementById("iframe");
 iframe.src = "a.com/proxy.html";//这是一个与a.com/app.html同源的页面
 iframe.onload = function(){
 var data = iframe.contentWindow.name; //取到数据
 }

</script>

data.html

<script>
 // 这里是要传输的数据,大小一般为2M,IE和firefox下可以大至32M左右
 // 数据格式可以自定义,如json、字符串
 window.name = "数据"
</script>

iframe首先的地址是b.com/data.html,所以能取到window.name数据;
但是iframe现在跟app.html并不同源,app.html无法获取到数据,所以又将iframe的链接跳转至a.com/proxy.html这个代理页面,现在app.html跟iframe就同源了。

注意:iframe由b.com/data.html跳转到a.com/proxy.html页面,window.name的value是不变的

获取数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)

<script type="text/javascript">
 iframe.contentWindow.document.write('');
 iframe.contentWindow.close();
 document.body.removeChild(iframe);
</script>

(四) document.domain + iframe

对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。
具体的做法是可以在http://www.a.com/a.html 和http://script.a.com/b.html 两个文件中分别设置document.domain = 'a.com',然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。
http://www.a.com/a.html页面

<iframe src="http://script.a.com/b.html" frameborder="0"></iframe>
<script>
 document.domain = 'a.com';
</script>

http://script.a.com/b.html页面

<script>
 document.domain = 'a.com';
</script>

这样俩个页面就可以通过js相互访问各种属性和对象了。

document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a.b.example.com 中某个文档的document.domain 可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成 c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。

(五) HTML5的window.postMessage

window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。
window.postMessage允许两个窗口/帧之间跨域发送数据消息。从本质上讲,window.postMessage是一个跨域的无服务器垫片的Ajax。

用法:
otherWindow.postMessage(message, targetOrigin);

  • otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.+open的返回值;通过name或下标从window.frames取到的值。
  • message: 所要发送的数据,string类型。
  • targetOrigin: 用于限制otherWindow,“*”表示不作限制

数据发送端
a.com/index.html中的代码:

<iframe id="ifr" src="b.com/index.html"></iframe>
<script type="text/javascript">
window.onload = function() {
 var ifr = document.getElementById('ifr');
 var targetOrigin = 'http://b.com'; // 设定接收端的域,*则为不限制
   
 ifr.contentWindow.postMessage('I was there!', targetOrigin);
};
</script>

数据接收端
b.com/index.html中的代码:

<script type="text/javascript">
 window.addEventListener('message', function(event){
 // 通过origin属性判断消息来源地址
 if (event.origin == 'http://a.com') {
 alert(event.data); // 弹出"I was there!"
 alert(event.source); // 对a.com、index.html中window对象的引用
   // 但由于同源策略,这里event.source不可以访问window对象
 }
 }, false);
</script>

以上就是js实现跨域的多种方法,希望对大家的学习有所帮助。

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn