JSON 知识量:10 - 17 - 48
同源策略会对网络数据的传播起到保护作用,但同时也会影响一些必要的资源传输。为了使用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文件,可以使用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,都离不开服务器端的支持。
专业术语:
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资源请求成功。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6