一篇文章带你了解跨域以及怎么解决跨域问题

一.什么是跨域

二.为什么要跨域

三.如何解决跨域

四.跨域的解决方案

一.什么是跨域

      (1)违反了浏览器的同源策略就叫做跨域(官方解释点这 --->同源策略),这也是发生跨域的根本原因。

            同源策略(Same-Origin Policy)最早由Netscape 公司提出,是浏览器的一种安全策略

      (2)对于 “违反了浏览器的同源策略就叫做跨域” ,我们可以这样理解。在发送ajax请求时,请求目标 的 url 与本机的 url,如果这两个 url 的协议、主机地址、端口都相同,那么这两个 url 是同源的。即这两个 url 是同源的,自然不会发生跨域。

      如果这两个 url 的协议、主机地址、端口,三个条件中有一个条件不符合,就是违反了浏览器的同源策略,就是发生了浏览器的跨域。

      我们可以参考如下图,帮助了解(官方的截图)

     下表给出了与 URL http://store.company.com/dir/page.html 的源进行对比的示例:

二.为什么要跨域

     (1)对于某些资源来说,这些资源很可能放在不同的服务器上,所以很大可能就导致了非同源,而请求不同源的资源就需要跨域。

    (2)并且同源策略是客户端浏览器的自我保护机制。

           这是为了保证用户的信息安全和防止恶意攻击。如果没有同源策略,那么一个网站就可以访问另一个网站的用户信息,这是非常危险的。

       注意:跨域问题只出现在客户端浏览器上。 如安卓端浏览器是不存在跨域问题的

三.如何解决跨域

对于解决跨域问题,本次主要介绍三种方式。三种方式各有千秋

(1)通过 JSONP 方式

(2)通过 CORS 方式

(3)通过代理服务器转发方式

3.1 通过 JSONP 方式

(1) JSONP 是什么

      JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,但只支持get 请求。所以使用 JSONP 方式解决跨域还是存在很大的限制。

(2)JSONP 怎么工作的

      在网页有一些标签天生具有跨域能力,比如:img link iframe script。JSONP 就是利用script 标签的跨域能力来发送请求的。

(3)JSONP 的使用

   html 代码:

            //1. 创建 script 标签
            const script = document.createElement('script');
            //2. 设置标签的 src 属性
            script.src = 'http://127.0.0.1:8000/check-username?callback=abc';
            //3. 将script 添加到body 中
            document.body.appendChild(script);
            function abc(data) {
                alert(data.name);
            };

  发送 ajax 代码:

app.get("/check-username" , function (req , res) {
    var callback = req.query.callback;
    const data = {
        name: '孙悟空'
    };
    //将数据转化为字符串
    let str = JSON.stringify(data);
    //返回结果(一段可执行的JavaScript代码)
    response.end(`handle(${str})`);
});
3.2 通过 CORS 方式

(1)CORS 是什么

       CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS 是官方的跨域解决方 案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持 get 和post 请求。跨域资源共享标准新增了一组HTTP 首部字段,允许服务器声明哪些 源站通过浏览器有权限访问哪些资源

(2)CORS 是什么工作的?

      CORS 是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应 以后就会对响应放行。

(3)CORS 的使用

主要是服务器端的设置:

router.get("/testAJAX" , function (req , res) {
    //通过res 来设置响应头,来允许跨域请求
    //res.set("Access-Control-Allow-Origin","http://127.0.0.1:3000");
    res.set("Access-Control-Allow-Origin","*");//允许所有来源访问
    res.send("testAJAX 返回的响应");
});
3.3 通过代理服务器转发方式

       (1)跨域只在浏览器中出现,这是 node 代理服务器(对于平常的学习或者项目来说,代理服务器一般使用的就是代理服务器),所以是不会出现跨域的。

      (2)对于使用目标服务器(后端服务器),我选择使用的是 mongodb 服务器,它的语言是 No-SQL 类似于 JS 对象,对我们前端友好。

***********************************************************

mongodb 服务器 的软件与安装教程在网盘内,自取

链接:https://pan.baidu.com/s/1N_JgvjrNqvgNPWTdpJohaQ 
提取码:8z9q 

****************************************************************

对于安装 mongodb 后,如果无法连接服务器,出现

“连接本地mongo数据库失败:connect ECONNREFUSED: :1:27017” 的问题 可参考

https://blog.csdn.net/jian091309/article/details/131839214


四.跨域的解决方案

      最佳的方案肯定是将前端项目部署到和接口同源的服务器上,但是这种方案行不通,因为不可能前端写完一个功能就又要后端去部署到服务器。

     所以更加推荐通过代理服务器转发方式去解决跨域问题。

猜你喜欢

转载自blog.csdn.net/jian091309/article/details/131882092