ajax 跨域请求api_不得不讲的跨域

34a9ba6ec7bcabbade480437a8269e81.png

我的第一篇博客就从跨域说起,尝试着把自己所学习的分享给大家!

什么是跨域

  • 单是从字面意义上来讲的话, 跨是跨越种族、跨越性别…… 域是领域、域名。
  • 在说跨域之前呢想要先说下《同源策略》

何为同源?

官方给出的定义是:

如果两个页面的协议,端口(如果有指定)和主机都相同,则两个页面具有相同的源。我们也可以把它称为“协议/主机/端口 tuple”,或简单地叫做“tuple". ("tuple" ,“元”,是指一些事物组合在一起形成一个整体,比如(1,2)叫二元,(1,2,3)叫三元)

那我们就可以理解为:

以百度的网址举例: 

https://www.baidu.com:80/aa 

https:// 或者 http:// 协议

www.baidu.com 域名

80 端口

以上3者相同就是同源,如果有其中一个不同就是跨域

另外同源策略又分为以下两种:

  1. DOM 同源策略:禁止对不同源页面 DOM 进行操作。这里主要场景是 iframe 跨域的情况,不同域名的 iframe 是限制互相访问的。
  2. 策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。

所以这样我们就可以明白为什么会有同源策略,由于浏览器的限制而产生的,浏览器有《同源策略》的限制 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 它的核心就在于它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源。

  • SO! 什么是跨域的问题我们也就明白了, 跨域的产生就是由于 浏览器 同源策略的限制,限制了不能跨域访问 http请求

如何解决跨域问题

  • 俗话说的好,上有政策,下有对策。那么浏览器限制了我们的跨域请求,那如果我们需要访问不同源的时候该怎么办呢?还请跟我一起往下看~~

跨文档通信API: window.postMessage()

它可用于解决以下方面的问题:

  • 页面和其打开的新窗口的数据传递
  • 多窗口之间消息传递
  • 页面与嵌套的iframe消息传递
  • 上面三个场景的跨域数据传递
// 父窗口打开一个子窗口

调用message事件,监听对方发送的消息

// 监听message消息

JSONP

jsop是利用资源不跨域的特性,同源策略只是限制了xhr对象发送的请求,并没有限制资源加载,所以jsonp利用了这个特性可以解决浏览器的跨域(需要后端配合)

如何使用jsonp解决跨域:

1
  • 优点: 解决了跨域, 兼容
  • 缺点: 只能get请求, 不能捕获错误状态

cors 跨域资源共享

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

简介 CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

前端发送正常的http请求

$

服务端设置:

node实现:

app
  • 优点: 可以跨域 前端不需要做任何处理 正常ajax请求,不需要依赖其他特性
  • 缺点: 兼容性问题, 场景: 如果接口是共享接口,并且不需要关心ie低版本浏览器 适合移动端项目(接口域名和项目域名是分开)

PHP:

response

Nodejs中间件代理跨域

node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。

  1. 非vue框架的跨域(2次跨域)
var 
  • 2.vue框架的跨域

(webpack.config.js)

module

代理

在开发项目的时候一般都是前后端分类,后端提供接口与,前端请求接口并且渲染页面,这个时候就会出现跨域问题。 在开发环境中前端项目是localhost, 而后端提供接口是 192.168.0.19:3000 但是项目上线后都变成了 http://www.baidu.com 统一域名,不存在跨域了,也就是开发环境中存在跨域,而生产环境没有跨域问题了,这个时候我们就可以使用代理的形式解决跨域

解决方案 利用了服务器不存在跨域的特性进行解决,(通过我自己本地服务端去代理请求跨域的接口,在通过我本地的服务返回给我本地页面)

正向代理 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

module

反向代理

应用场景 开发环境下有跨域问题,部署到线上后就没有跨域

nginx反向代理接口跨域

通过nginx配置一个代理服务器(域名与demo1相同,端口不同)做跳板机,反向代理访问demo2接口,并且可以顺便修改cookie中demo信息,方便当前域cookie写入,实现跨域登录。

nginx具体配置:

#proxy服务器

好啦,今天就写到这里吧!可能有说的不准确或者不全面的地方,还请大家多多给予反馈,毕竟个人理解和学习的能力还是有限的。希望和大家一起学习,共同进步!!

鄙人在这里给大家劈个叉了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值