跨域
定义
指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。 同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;
产生原因
同源策略(Same Orgin Policy)是一种约定,它是浏览器核心也最基本的安全功能,它会阻止一个域的js脚本和另外一个域的内容进行交互,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。
所谓同源(即在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。
非同源限制
无法读取非同源网页的cookie、localstorage等
无法接触非同源网页的DOM和js对象
无法向非同源地址发送Ajax请求
解决办法
Nginx反向代理
正向代理就是
a-->b访问不了,可以找个中间的服务器c, 先访问c再从c到b,类似曲线救国。
明确访问的目的地,但是用户不知道中间的代理服务器。(忽略中间服务器)
反向代理
a明确访问c代理服务器,但是不知道c的内容从哪里来,c反向从别的地方拿来数据。(忽略的是目标地址)
A访问B,但是A通过一个代理服务器访问B,这样B就不知道A的IP信息。 反向代理就是A通过访问代理服务器,然后代理服务器从其他地方拿信息
Jsonp
利用script没有限制同源
当我们插入一个 <script src="xxx.com"> 标签的时候,会发一个获取 xxx.com 的 GET 请求,而这个 GET 请求又不存在“跨域”限制,通过这样的方法就能解决跨域的问题了。
用户传一个callback函数名字给服务器,然后服务器会用这个callback函数包裹返回的数据,客户端接收后做出相应的响应。
jsonp兼容性强,尤其是IE10之前的,但是只支持GET方法。
CORS
解决Ajax只能同源访问,浏览器发现Ajax跨域访问的时候会自动在请求头加一个Origin字段,用来说明本次请求来自哪个源(协议+域名+端口)。关键是服务器需要配置Access-Control-Allow-Origin头信息,用来说明哪些域可以通过