为什么要解决跨域的问题

由于浏览器的同源政策的影响,A网站下面的客户端能够发送请求给B网站的服务器端,但是由于浏览器的同源政策,浏览器会自动拦截B网站发送回来的响应的信息。

解决跨域的第一种方法

利用 script 标签中的 src 属性去解决

// 该jsonp方法传递的参数是一个对象
function jsonp (options) {
    // 动态创建script标签
    var script = document.createElement('script');
    // 拼接字符串的变量
    var params = '';
    
    for (var attr in options.data) {
        params += '&' + attr + '=' + options.data[attr];
    }
    
    // myJsonp0124741
    var fnName = 'myJsonp' + Math.random().toString().replace('.', '');
    // 它已经不是一个全局函数了
    // 我们要想办法将它变成全局函数
    window[fnName] = options.success;
    // 为script标签添加src属性
    script.src = options.url + '?callback=' + fnName + params;
    // 将script标签追加到页面中
    document.body.appendChild(script);
    // 为script标签添加onload事件
    script.onload = function () {
        document.body.removeChild(script);
    }
}

解决跨域的第二种方法

利用CORS:其实当浏览器检测到客户端的请求是跨域的时候,会在请求头上面添加一个origin字段保存本网站的网址。然后再发送请求给另一个网站。如果另一个网站接受了我们跨域的请求,那么响应头上面也会有一个origin字段。浏览器会自动判断响应头是否有origin字段来判断服务器是否接受我们的跨域的请求。

// 服务器端需要配置,客户端无需修改操作
// 拦截所有的请求
app.use((req, res, next) => {
	// 接受所有网站发送过来的跨域请求
	res.header('Access-Control-Allow-Origin', '*');
	// 接受跨域的请求的方法
	res.header('Access-Control-Allow-Methods', 'get, post');
)

解决跨域的第三种方法

其实是利用服务器端之间的通信,因为服务器端之间的通信并没有同源政策的影响。
原理: 客户端先发送请求给本网站A,A再发送跨域请求给网站B。B响应数据给A,A最后再把数据响应回去给客户端。

// A服务器端如何发送请求给B服务器端
const request = require("request");
request('要请求的网址', (err, response, body) => {
	// 第一个参数是要请求的另一个服务器端地址
    // 第二个参数是回调函数
    // error代表错误对象
    // response代表响应信息对象
    // body代表返回的主体内容数据(响应数据)
})