来自《javascript高级程序设计 第三版:作者Nicholas C. Zakas》的学习笔记(十)

  通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略。默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。CORS(Crossing-Orgin Resourse Sharing,跨域资源共享),定义了在必须防问跨域资源时,浏览器与服务器应该如何沟通。其背后的思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。


  IE对CORS的实现:


  IE8中引入了XDR:

  

xhr.open("post","example.php",true);
var form = docuent.getElementById("user-infor");
xhr.send(new FormData(form)); var xdr = new XDomainRequest();
xdr.onload = function() {
alert(xdr.responseText);
};
xdr.onerror = function() {
alert("An error");
};
xdr.open(....);
xdr.contentType = "...";
xdr.send(...);

 


其它浏览器对CORS的实现:


  都是通过XMLHttpRequest对象实现对CORS的原生支持。尝试打开不同来源的资源的时候,无需额外编写代码就可以出发这个行为。要请求位于另一个域中资源,使用标准的XHR对象并在open()方法传入绝对URL即可。

  为了安全,有以下限制:

  ① 不能使用setRequestHeader()设置自定义头部;

  ② 不能发送和接受cookie;

  ③ 调用getAllResponseHeaders()方法总会返回空字符串。


  跨浏览器的CORS


  检测XHR是否支持CORS的最简单方式,就是检查是否存在withCredentials属性。再结合检测XDomianRequest对象是否存在,就可以兼顾所有浏览器了。

function createCORSRequest(method,url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
xhr.open();
}else if (typeof XDomianRequest != "undefined") {
vxhr = new XDomainRequest(method,url);
vxhr.open(method,url);
}else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get","http://www.google.hk");
if(request) {
request.onload = function() {
//对request.reponseText进行处理
};
request.send();
}

  其它跨域技术:


  ① 图像ping

  与服务器进行简单、单向的跨域通信。请求的数据是通过查询字符串形式发送的,而响应可以是任意内容,但通常是像素图或204响应。通过图像ping,浏览器得不到任何具体的数据,但通过侦听load和error事件,能够知道响应是什么时候接收到的。

var img = new Image();
img.load = img.onerror = function() {
alert("Done");
};
img.src = "http://www.example.com/test?name=Carol";

  图像ping方法常用于跟踪用户点击页面或动态广告曝光次数。图像ping有两个主要的缺点,一是只能发送GET请求,二是无法访问服务器的响应文本。因此图像ping只能用于浏览器与服务器间的单向通信。


  ②JSONP

  JSON with padding,与json相比就是被包含在函数调用中的JSON

callback({"name":"carol"});

  JSONP由两部分组成:毁掉函数和数据。回调函数是当响应到来时应该在也页面中调用的函数。调用函数名字一般是在请求中指定。而数据就是传入回调函数中的JSON数据。JSONP是通过动态<script>元素来使用的,使用的时候可以为src属性指定一个跨域URL。

function handleResponse(response) {
alert("you are at IP address" + response.ip + response.city);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handleResponse";
document.body.insertbBefore(script,document.body.firseChild);

  相比于图像ping,它的优点在于能够直接访问响应文本,支持浏览器与服务器之间双向通信。但是,跨域的不安全仍然存在。

javascript中跨源资源共享的更多相关文章

  1. JavaScript跨源资源共享

    CORS(跨 源资源共享)基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应式应该成功还是失败 IE对CORS的实现 IE8引入了XDR类型,与XHR类似,但可以实现安 ...

  2. 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍

    本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...

  3. 彻底掌握CORS跨源资源共享

    本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...

  4. CORS跨源资源共享概念及配置(Kubernetes Ingress和Spring Cloud Gateway)

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 跨源资源共享CORS 跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过 ...

  5. js-跨域源资源共享(CORS)

    ### 一. CORS(Cross-Origin Resource Sharing,跨域源资源共享) 基本思想:使用自定义HTTP头部让浏览器与服务器进行沟通 发送请求时,需附加一个Origin头部 ...

  6. JS高程3:Ajax与Comet-进度事件、跨源资源共享

    有以下 6 个进度事件  loadstart:在接收到响应数据的第一个字节时触发.  progress:在接收响应期间持续不断地触发.  error:在请求发生错误时触发.  abort:在因 ...

  7. SpringBoot系列——CORS(跨源资源共享)

    前言 出于安全原因,浏览器禁止ajax调用当前源之外的资源(同源策略),我们之前也有写个几种跨域的简单实现(还在问跨域?本文记录js跨域的多种实现实例),本文主要详细介绍CORS,跨源资源共享,以及如 ...

  8. JavaScript特效源码(1、文字特效)

    注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...

  9. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

随机推荐

  1. iOS开发——app审核指导方针(官网)

    iOS 开发后上传到App Store审核的指导方针 ——苹果官网介绍地址 https://developer.apple.com/app-store/review/guidelines/

  2. 创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来

    /*4.创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来*/ #import <Foundation/Foundation.h>#defin ...

  3. JavaScript学习笔记(12)——JavaScript自定义对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. C#判断Textbox是否为数字

    第一种方法: try { ) { //操作代码 } else { MessageBox.Show("必须是正整数"); } } catch (FormatException) { ...

  5. Comparator和Comparable

    java.util 接口 Comparator<T>   compare int compare(T o1, T o2) 比较用来排序的两个参数.根据第一个参数小于.等于或大于第二个参数分 ...

  6. 线程间操作无效: 从不是创建控件“label4”的线程访问它。

    //主线程 public delegate void UpdateMessage(string mes); public void UpdatePortMessage(string mes) { th ...

  7. WiFi安全之WPA介绍

    WPA,全称为Wi-Fi Protected Access,是一种保护WiFi安全的系统,实现了IEEE 802.11i的大部分标准,是一种替代WEP的过渡方案. 这个协议包含了前向兼容RC4的加密协 ...

  8. urllib2.urlopen超时

    urllib2.urlopen设置超时,可以解决read方法阻塞的问题 urllib2.urlopen(‘xxx’,timeout=30)

  9. 关于进程间通信的总结(IPC)

    一:三个问题 进程间通信简单的说有三个问题.第一个问题是一个进程如何把信息传递给另一个.第二个要处理的问题是是,要确保两个或更多的的进程在关键互动中不会出现交叉(即是进程互斥的问题),第三个问题是与正 ...

  10. DTCMS获取栏目子类

    <%set DataTable categoryList=get_category_child_list(channel,0)%> <%foreach(DataRow cdr in ...