Ajax 跨域

206 阅读3分钟

跨域概念

当出现域、协议(http、https)或者端口等其中一样不同的时候默认的是跨域请求。说明:但是如果路径不同的话不属于跨域,如:localhost:8080/a和localhost:8080/b

跨域问题的出现

因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。

同源策略

同源策略是一种约定,由Netscape公司1995年引入浏览器,是浏览器最核心也最基本的安全功能。保证用户信息的安全,防止恶意的网站窃取数据。比较常见的就是XSS、CSFR等攻击。 既然有安全问题,那为什么又要跨域呢? 举个例子,假如公司内部有多个不同的子域,一个是location.company.com ,另一个是app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就需要跨域。

发现

开发模式下(F12)查看发出的对应的请求的结果,结果是200的返回,可以的出的结论是请求发出去了,并且返回了,但是让浏览器进行拦截了。

jsonp原理

由于script发出的请求由于规则不存拦截的,基于这一规则,使得ajax封装的和script请求连接一样,发出请求。但此方法无官方正式确定。

浏览器端解决跨域

根据上面的结论,我们可以让浏览器不做限制,以chorme浏览器为例, 如果设置为支持跨域模式,只需以下几步。

在电脑上新建一个目录,例如:C:\MyChromeDevUserData。这是保存个人信息的目录,是chrome浏览器防止用户使用跨域模式泄露自己的个人信息采用的措施,这里不详细探讨。 在属性页面中的目标输入框里加上 --disable-web-security --user-data-dir=C:\MyChromeDevUserData,--user-data-dir的值就是刚才新建的目录。 点击应用和确定后关闭属性页面,并打开chrome浏览器。发现有“--disable-web-security”相关的提示,说明chrome能正常跨域工作了。 说明:这种解决方式意义不大,因为需要所有的客户端做改动,并且每个用户使用的浏览器也各不相同,处理的方式也不同。在这里介绍这种解决方式,只是为了更进一步说明,产生跨域访问限制的根源就是浏览器。

说明:以上部分字段来自 www.jianshu.com/p/02699b244…,

跨域问题的解决

  • Jsonp

最早的解决方案,利用script标签可以跨域的原理实现。

限制:

需要服务的支持 只能发起GET请求

  • nginx反向代理

思路是:利用nginx反向代理把跨域为不跨域,支持各种请求方式

缺点:需要在nginx进行额外配置,语义不清晰

  • CORS

规范化的跨域请求解决方案,安全可靠。

优势:

在服务端进行控制是否允许跨域,可自定义规则 支持各种请求方式 缺点:

会产生额外的请求

cors解决跨域

cors 又称跨域资源共享 原理是发出xmlHttpRequest请求,从而克服ajax同源请求。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

  • 浏览器端:

目前,所有浏览器都支持该功能(IE10以下不行)。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。

  • 服务端:

CORS通信与AJAX没有任何差别,因此你不需要改变以前的业务逻辑。只不过,浏览器会在请求中携带一些头信息,我们需要以此判断是否运行其跨域,然后在响应头中加入一些信息即可。这一般通过过滤器完成即可。