同源

同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。

跨域

1. 跨域类型

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js 同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js 同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js 同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js 同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js 域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js 主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js 不同域名 不允许

2. 跨域方案

顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)

document.domain + iframe

window.name + iframe

location.hash + iframe

window.postMessage()

3. JSONP

JSON with Padding其本质是利用了<script src=""></script>标签具有可跨域的特性,
由服务端返回一个预先定义好的Javascript函数的调用,
并且将服务器数据以该函数参数的形式传递过来,
此方法需要前后端配合完成。

只能以GET方式请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

// echo "alert('hello')";

$callBack = $_GET['callback'];

$arr = array(

'name' =>'flower' ,

'color' =>'red'

);

echo $callBack."(".json_encode($arr).")";

?>

核心是通过script标签的src属性提交get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<script type="text/javascript">

function fn(data){

console.log(data);

}

</script>

<script type="text/javascript" src='http://www.section02.com/seciton02_jsonP.php?callback=fn'></script>

</head>

<body>

<h1>区域1的页面_jsonP演示</h1>

</body>

</html>

4. jQuery 的$.ajax() 使用JSONP

方法当中集成了JSONP的实现,可以非常方便的实现跨域数据的访问。

dataType: 'jsonp' 设置dataType值为jsonp即开启跨域访问

jsonp 可以指定服务端接收的参数的“key”值,默认为callback

jsonpCallback 可以指定相应的回调函数,默认自动生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<script type="text/javascript" src='jquery/jquery-3.0.0.min.js'></script>

</head>

<body>

<h1>区域1的页面</h1>

<input type="button" name="" onclick='sendAjax()' value="jquery区域请求">

</body>

</html>

<script type="text/javascript">

function sendAjax(){

$.ajax({

url:'http://www.section02.com/sectcion02_jqJsonp.php',

type:'post',

dataType: 'jsonp',

data:{name:'itt'},

success:function(data){

console.log(data);

}

})

}

</script>

通过$.getJSON()实现跨域

1
2
3
4
//在地址中加上callback=?参数即可
$.getJSON("https://api.douban.com/v2/book/search?q=javascript&count=1&callback=?", function(data){
console.log(data);
});