1,同源
1.1同源是什么
如果两个页面的协议,域名和端口一致则这两个页面属于同一个源,其中只要有一个不相同就是不同源。
1.2同源政策
ajax只能向自己的服务器发送请求,例(A网站中的HTML文件只能向A网站服务器发送ajax请求,B网站中的HTML只能向B网站发送ajax请求)
同源政策的目的:保护用户信息的安全,防止恶意的网站窃取。
1.3同源限制的解决方案
第一种jsonp 解决跨域请求 重点
第二种: 静态script标签 的src属性 进行跨域请求
第三种: 动态script标签的 src属性 发送跨域请求
1.3.1使用jsonp解决同源限制的问题
核心:1,动态创建script标签,将不同源的服务端请求地址写在script标签的src属性中。
2,服务器端响应的数据必须是一个函数的调用,正在发送给客户的数据需要作为函数调用的参数返回。
例:jsonp的封装:
function jsonp(obj) {
var defaults = {
url: '#',
dataType: 'jsonp',
jsonp: 'callback',
success: function(data) {
console.log(data);
}
}
for (var key in obj) {
defaults[key] = obj[key];
}
var cbName = 'jQuery' + ('1.11.1' + Math.random()).replace(/\D/g, '') + '_' + (new Date().getTime());
if (defaults.jsonpCallback) {
cbName = defaults.jsonpCallback;
}
indow[cbName] = function(data) {
obj.success(data);
}
var param = '';
for (var attr in obj.data) {
param += attr + '=' + obj.data[attr] + '&';
}
if (param) {
param = param.substring(0, param.length - 1);
param = '&' + param;
}
var script = document.createElement('script');
script.src = defaults.url + '?' + defaults.jsonp + '=' + cbName + param;
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
}
注:jsonp不是一种数据格式,它是用来解决跨域获取数据的一种解决方案核心是通过动态创建script标签,然后通过标签的src属性获取js文件中的js脚本,该脚本的内容是一个函数调用,参数是服务器返回的数据,需要事先在页面上定义好回调函数其本质并不是ajax技术 |