Json
Json是java script object notation 英文单词的缩写,广泛应用于API传输数据的应用。本质上,它是一串字符串,也就是string。这个string的内部书写格式是按照java script object的格式来书写(notation由此而来)。
{name: "Jack", age: 25} 是一个简单的小例子。
CORS
CORS 全称 cross origin resource sharing,翻译过来的意思:跨越起始域的资源共享。理解这个问题只要需要将问题简化成若干个小问题:
什么是起始域?
起始域是指浏览器获取静态html等资源的来源。这个来源可以被协议、域名、端口组成的3元素所标识。例如:https://www.baidu.com:8000,协议是https、域名是www.baidu.com 、端口号是8000。
当用户通过浏览器访问上述网址的时候,浏览器会记住用户访问资源的来源标识。
什么是跨越
当页面嵌入的ajax请求中的请求地址(协议、域名、端口)与起始域有不同的时候,就是跨域。例如:你访问的网页是www.baidu.com, 页面中嵌入的ajax请求的网址确实www.google.com。 这就是跨域的ajax请求。 浏览器默认是禁止跨域传输数据的。ajax的请求是可以正常发送和接收的,在浏览器接收后,到呈现在页面中的时候,会被拦截过滤掉。
Jsonp
要说jsonp,就必须要了解<javascript>标签,我们在html页面中通常都是用来向某个url请求获取一份js代码,然后运行它。浏览器对ajax的请求是禁止跨域的,但是对<javascript>却是没用限制的。
ajax和<javascript>的请求有相似的地方,两者都是发送请求,祈求获取回应,不同的地方在于ajax请求中,接收到的数据是programmable的。<javascript>请求中,接收到的数据浏览器会当成一段js代码直接执行,程序员是没有机会对接收的数据进行处理的。
<javascript>标签存在一个小小漏洞,如果请求回来代码是这样子的:changeWeather('Sun')。而我们的网页中刚好存在一个函数叫changeWeather,那会发生什么?是的,当这份代码被浏览器执行后,我们网页中的changeWeather会被执行。
这个过程就是jsonp来解决cors的方案之一,jsonp就是上面传输的过来的代码changeWeather('Sun')。
跨域解决
对数据来源的限制是出于安全的考虑,jsonp的解决方案并不是一个优雅的方案。利用‘注入入侵’的手段来作为常规的数据传输方案,有悖于一个优良网页程序的初衷。我甚至有一点点讨厌这种看似‘聪明的方案’。为达目的,不惜破防秩序的手段要么会将秩序改写,要么终将被淘汰。
跨域的解决手段很多,而且很符合安全精神,jsonp,了解就好,不建议使用。