网上的同源和跨域一般都比较复杂,最近也稍微总结了一下:
所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为
同源的条件:1.协议相同 2.域名相同 3.端口号相同
注意点:同源 浏览器对服务器的请求其实是成功的,服务器也有响应,但是因为浏览器的拦截导致报错,所以说不成功
跨域:不同源的网页之间发出请求就是跨域
如何实现跨域?jsonp(json with padding) cors
有三个标签不受同源的影响 为img link script
script最为重要,这也是jsonp的原理,利用script 的 src 不受同源策略影响 ,这里只能使用get发出请求,因为实际是动态创建script标签并设置src去请求服务器,在请求地址后拼接函数callback='函数名',从而实现跨域
以php举例子,在$_GET中,获取callback的值即可实现需求
function fn(res){
console.log(res)
}
代码 button.onclick = function(){
//创建
var script = document.createElement('script');
//赋值
script.src = '地址?callback = fn'
//追加
document.body.appendChild(script);
}
php中
echo "$_GET('callback')"."(数据)";
服务端调用函数的字符串就会被执行,从而得到返回数据
当然用jQuery只需要简单的dataType : 'jsonp',写这么多原生js也是为了更好理解
最后说一下jsonp 和 cors两种解决跨域的方法
jsonp cors
只支持get(数据量有限) get/post
兼容性好 IE10+,cors对前端友好,都不需要前端人员设置.在php中添加响应头即可(
)
共同点:都需要后端的配合,单独的前端是完成不了跨域需求的,就算是jsonp也需要后端对callback获取,更别说cors没有前端的事了
本人才疏学浅,只会点php皮毛,举例子也都是php的,前端学徒.....