[前后分离]跨域、CORS/JSONP

196 阅读3分钟

一、 同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略。则浏览器正常功能都会受到影响。

所谓同源是指,域名协议端口相同。 当一个浏览器的两个tab页中分别打开 百度和谷歌的页面,浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。

如果非同源,那么请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

同源:域名、协议、端口相同,也就是在同一个域里。

非同源受到的限制

  • cookie不能读取
  • dom无法获得
  • ajax请求不能发送

二、 浏览器跨域

概念: 跨域问题来源于浏览器的同源策略,浏览器为了提高网站的安全性,在发送ajax请求时,只有在当前页面地址与请求地址的协议+域名+端口号相同时才允许访问,否则会被拦截。

例如:

  • 比如我们现在常见的http和https,如果当前页面地址使用http协议,请求的地址使用https协议,那么这个请求就存在跨域问题。

  • 域名即网站网址,如baidu.com,360.com存在跨域。

  • 端口号即域名对应的服务器的监听端口,这个我们一般是看不到的,因为一般服务器都使用80端口,浏览器默认为80端口,所以不需要在域名后再写出端口号。当8080端口发出的请求为80端口时,也存在跨域。

三、解决跨域的方法

解决跨域的常用方法有两种:CORS(跨域资源共享),jsonp

CORS

因为出于安全的考虑, 浏览器不允许Ajax调用当前源之外的资源. 即浏览器的同源策略. CORS需要浏览器和服务器同时支持。目前,所有主流浏览器都支持该功能,IE浏览器不能低于IE10。在浏览器端, 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,用户对这些都不会有感觉。因此,实现CORS通信的关键是服务器。

jsonp

  1. JSONP是通过 script标签加载数据的方式去获取数据当做 JS代码来执行
  2. 提前在页面上声明一个函数,函数名通过接口传参的方式传给后台,后台解析到函数名后在原始数据上「包裹」这个函数名,发送给前端。换句话说,JSONP 需要对应接口的后端的配合才能实现。