跨域产生的原因:同源策略
同源政策:两个页面拥有相同的协议、端口、域名就是同源,其中一个不同就是不同源,目的是保护用户的信息安全,防止其他网站盗取信息。
解决方案:
// 1.封装一个jsonp函数;
jsonp({
// method: 'GET',// 所有的jsonp请求都是get请求,所以这个属性可以不写了
// data: , // 写了以后太繁琐,取消
url: 'http://www.localhost:3006/api/jsonp',
success: function (res) {
console.log(res)
}
})
// 封装
function jsonp(obj) {
// 1.创建一个script标签; 2.改变src 3.给函数起名字,定义为全局函数;
var script = document.createElement("script"); // 不要用innerHTML, 他不会自动发送请求
// 3.给函数起名字,定义为全局函数;
var fnName = "haha_123123";
// window.aaa就是把aaa设置为全局变量!
window[fnName] = obj.success;
// 2.改变src,添加到head中
script.src = obj.url + "?callback=" + fnName;
// 把script标签添加到head标签中,就会发送src的请求了
document.head.appendChild(script);
// 代码执行完毕,把script标签删除
script.onload = function () {
document.head.removeChild(script);
window[fnName] = undefined;
}
}
服务端代码
app.get("/api/jsonp", (req, res) => {
// 获取函数名,设置对象,发送给客户端
const fnName = req.query.callback;
// 定义发送给客户端的对象转换为json字符串
var objStr = JSON.stringify({
name: '张三',
age: 18
});
// 字符串类型的执行函数
res.send(`${fnName}(${objStr})`);
});
1.Access-Control-Allow-Origin 字段 (指定了哪些域名或ip地址可以跨域 也可以写* 代表允许所有地址)
res.setHeater('Access-Control-Allow-Origin',' http://XXX.cn || * || ip地址 ');
2.CORS默认支持9个请求头,如果在9个请求头之外 要单独设置,多个请求头之间要用英文逗号隔开。
res.setHeater('Access-Control-Allow-Headers','Content-Type,X-Custom-Header');
3.默认情况下CORS仅支持客户端发起的GET、POST、HEAD请求,如果希望客户端发送PUT、DELETE请求需要在服务器端设置
res.setHeater('Access-Control-Allow-Method','GET');
//vue.config.js
devServer: {
proxy: {
// 如果请求地址以/api打头,就出触发代理机制
// http://localhost:8080/api/login -> http://localhost:3000/api/login
'/api': {
target: 'http://localhost:3000' // 我们要代理的真实接口地址
}
}
},