跨域是浏览器出于安全的同源策略,简单来说:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是属于跨域。
这里简单说一下,对域名、端口、协议的理解
htttps://www.123.com:8080
协议:好像目前协议分为http和https,https的安全性比http高
域名:www.123.com 域名就是紧跟协议之后的
端口号:8080,这里的端口号值的是逻辑端口,端口号的范围从0到65535,http常用的端口是80
解决跨域的方法有好几种,这里说到比较常用的几种
JSONP实现跨域(前端):
JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。
其实就是利用了标签的src属性,有src的属性的常见标签有img、iframe、script,同样link标签的href属性也可以跨域,这里标签就自带了跨域的天赋。
前端html代码
<button onclick="get()">获取数据</button>
<script type="text/javascript">
function get(){
var script = document.createElement("script");
script.src = "http://vueapp.com/Api/Mess?jsoncallback=callbackFunction";
document.body.insertBefore(script, document.body.firstChild);
}
function callbackFunction(result){
console.log(result)
}
</script>
后端php代码
header('Content-type: application/json');
//获取回调函数名
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);
//json数据
$json_data = '["mycustomername1","ycustomername2"]';
//输出jsonp格式的数据
echo $jsoncallback . "(" . $json_data . ")";
jsonp只支持get请求而不支持post请求
JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据
CORS跨域(后端)
可参考我的另外一篇文章tp3.2 跨域解决 https://blog.csdn.net/magic_xiang/article/details/81775434
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
相比JSONP,CORS支持所有类型的HTTP请求
所以一般来说处理跨域这个问题由后端处理比较好