1. 跨域数据传输的背景
在前端开发中,比较常见的一种需求就是需要通过ajax请求跨域获取数据,因为浏览器限制了从某个域名获取数据的机制,跨域数据传输成为了一项必须解决的难题。
本文将介绍使用PHP实现跨域数据传输的方法和步骤。
2. 同源策略
同源策略是浏览器的一项基本安全功能,即在ajax请求时,所请求的资源必须和当前页面的协议、域名和端口号完全一致,才能够正常获取数据。例如,一个页面地址为http://www.domain1.com/index.html,那么:
协议必须一致:http
域名必须一致:www.domain1.com
端口号必须一致:默认端口号为80,如果地址栏里没有写端口号,则也默认使用80端口(即http默认的端口号)
3. JSONP解决跨域问题
在之前,我们通常使用JSONP(JSON with Padding)方式实现跨域请求,原理是通过script标签的src属性,设置为目标URL,从而获取此URL的返回值,然后将获取到的数据View出来。这种方式实现起来并不复杂,但前提是目标服务器必须支持JSONP回调函数。具体实现方式如下:
<script type="text/javascript">
function jsonpCallback(data){
alert(data);
}
</script>
<script type="text/javascript" src="http://www.domain2.com/data.php?callback=jsonpCallback"></script>
上述代码实现了在客户端使用JSONP方式跨域请求服务器端的data.php,服务器端需要将数据包装在函数调用中返回,例如:
<?php
$data = array('name'=>'Q','.syr', 'age'=>24);
echo $_GET['callback'].'('.json_encode($data).')';
?>
4. CORS策略解决跨域问题
CORS策略(跨域资源共享)是一个W3C标准,可以让浏览器跨域访问其他域名下的资源。通过在服务器端设置header头,我们可以实现在客户端直接使用ajax请求进行跨域访问数据,避免了jsonp在服务器端的定制性,实现起来也相对简单。
4.1 实现CORS策略
在PHP中,实现CORS需要通过设置header头来进行,先来看一下代码实现:
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
上面的代码,我们设置了Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers三个头部信息,意思分别是:
Access-Control-Allow-Origin:允许跨域请求资源的域名。*表示所有域名都允许跨域请求。更多可见Access-Control-Allow-Origin
Access-Control-Allow-Methods:允许跨域请求的http方式。POST, GET表示这两种方式都允许跨域请求。
Access-Control-Allow-Headers:允许跨域请求的http头部信息。x-requested-with和content-type是请求头部信息的两个属性。
4.2 前端实现跨域请求
前端实现CORS跨域请求,可以通过XMLHttpRequest或fetch方式实现。下面是一个使用XMLHttpRequest实现跨域请求的示例代码:
var xmlhttp = new XMLHttpRequest();//创建实例
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var responseText = xmlhttp.responseText;
console.log(responseText);
}
}
xmlhttp.open('GET', 'http://www.domain2.com/data.php', true);
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');//设置http头部信息
xmlhttp.send();
上述代码中,我们使用了XMLHttpRequest对象实现跨域请求,通过设置http头部信息,以及对原生函数进行服务端判断等操作使得我们可以方便的实现CORS策略。
5. JSONP和CORS策略的优缺点比较
通过上面的学习,我们可以看出,JSONP和CORS策略都可以实现跨域请求,但两者又各有优缺点。
首先,JSONP相对简单,只需要在客户端添加一个script标签,包含一个callback参数即可实现跨域请求,而且不需要后端配合,灵活性高。但是,其局限性也比较明显,即只支持GET请求,无法发出POST等其它类型请求,并且存在安全性问题,其中主要存在XSS攻击风险。
相比之下,CORS策略比较复杂,需要前端和后端的配合,但是安全性更高,因为使用的是标准的HTTP方式传输,支持各种请求类型,而且支持cookie等身份认证信息。但是要注意的是,需要在服务器端进行相应的处理,否则可能会造成服务器端的安全隐患。
6. 总结
本文介绍了实现跨域请求的两种方式:JSONP和CORS策略。两者各有优缺点,需要根据实际业务的需要来进行选择。在选择JSONP的时候,需要注意其安全性问题,尽量不要泄露敏感数据;在选择CORS策略的时候,需要启用header头部设置、携带cookie等信息才能实现跨域请求。