JSON

JSON 知识量:10 - 17 - 48

6.2 资源共享><

跨域资源共享- 6.2.1 -

同源策略会对网络数据的传播起到保护作用,但同时也会影响一些必要的资源传输。为了使用AJAX技术从一些公共API获得数据,可以在服务器上实现跨域资源共享(CORS)。这些服务器会在响应头上额外加上一些带有Access-Control-Allow前缀的属性。例如:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:GET,POST
Access-Control-Allow-Origin:*

以上响应头部定义了证书是否可用,哪些HTTP方法(例如:GET,POST)是可用的,以及允许哪些域名访问。(*表示任意域名都可以访问本资源)

如果要加强安全防护,防止类似跨站请求伪造(CSRF)等的攻击,可以仅将指定的域名列为可访问本资源。例如:

Access-Control-Allow-Methods:POST
Access-Control-Allow-Origin:https://www.yourBank.com

以上头部定义了仅允许使用POST方式请求资源,仅允许https://www.yourBank.com访问资源。

JSON-P- 6.2.2 -

如果想让两个不同域名的网站共享JSON文件,可以使用JSON-P。JSON-P是指带有padding的JSON。<script>标签可以不受同源策略的影响,JSON-P就是利用这一点来向不同域名的站点请求JSON的。

JSON-P中的padding(内联)非常简单,就是将JavaScript加入JSON文档。例如:

getCar(
        {
            "car": "BMW"
        }
);

以上代码中,内联于JSON文档的JavaScript调用了一个函数,函数的参数就是JSON。函数参数提供了一种将数据传递给函数的方式。

以上函数是在客户端的JavaScript代码中定义的:

function getCar(data) {
    var myCar = data.car;
}

在JavaScript中声明了该函数后,需要进行一些设置,这里就体现出了JSON-P是如何利用<script>标签不受同源策略影响这一点的。如下所示:

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://someDomain.com/car.json";
document.getElementsByTagName("head")[0].appendChild(script);

以上代码的作用是:在JavaScript中创建一个<script>标签,定义了其URL指向car.json,并将该<script>标签动态的插入到HTML中。此外,服务器端也需要对JSON-P提供一定的支持,应允许用户自定义函数的名字。它通常是作为URL中queryString的参数传递的。例如:

script.src = "http://someDomain.com/car.json?callback=getThing";

服务器会根据callback参数的值来动态的为在JSON中内联的函数命名:

getThing(
        {
            "car": "BMW"
        }
);

JSON-P还需要服务器端的不少支持,因为JSON资源必须包含JavaScript内联。JSON-P并没有CORS那么理想,它只是一个备选方案。不管是使用CORS还是JSON-P,都离不开服务器端的支持。

专业术语和重要概念- 6.2.3 -

专业术语:

  • Web API:通过HTTP协议与服务器进行交互的一系列指令与标准。

  • XMLHttpRequest:一种JavaScript对象,无需刷新页面即可从一个URL地址获取数据,常用于AJAX编程。

  • 超文本传输协议(HTTP):万维网使用的交互数据的基本协议。

  • 序列化:将对象转化为文本的操作。

  • 反序列化:将序列化的文本转化为对象的操作。

  • 同源策略:处于安全考虑,浏览器仅会请求同一个域的脚本。

  • 跨域资源共享(CORS):通过设置响应头,使得跨域请求资源(如JSON文档)可以成功。

  • JSON-P:使用<script>标签,绕过同源策略的限制,以从不同域名的服务器上请求JSON。

重要概念:

  • JavaScript的XMLHttpRequest与Web API之间的关系是客户端与服务端之间的关系。

  • XMLHttpRequest并不仅限于XML,还可以用它来请求JSON资源。

  • 同源策略使得JavaScript和JSON资源进行客户端-服务端交流时出现了一些困难。

  • 客户端跨域的XMLHttpRequest需要服务端的支持来保证JSON资源请求成功。