javascript --- XMLHttp2级、CORS(跨域资源共享)

FormData:

// 为序列化表单以及创建与表单格式相同的数据提供了便利
var data = new FromData();
data.append("name", "Nicholas");// 使用FormData标准化数据后,发送到服务器
var xhr = createXHR();
xhr.onreadystatechange = function () {if ( xhr.readyState ==4){if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}
};
xhr.open("post", "postexample.pht", ture);
var form = document.getIEmentById("user-info");
xhr.send(new FormData(form));

超时设定:

// 仅适用于IE8
var xhr = createXHR();
xhr.onreadystatechange = function() {if( xhr.readyState == 4) {try {if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}} catch (ex) {// 假设由 ontimeout 事件处理程序处理}}
};
xhr.open("get", "timeout.php", true);
xhr.timeout = 1* 1000; // 超时设置为1秒
xhr.ontimeout = function () {alert("Request did not return in a second.");
};
xhr.send(null);

ouverrideMimeType方法:

// 用于重写XHR响应的MIME类型
var xhr = createXHR();
xhr.open("get", "text.php", true);
xhr.overriderMimeType("text/xml");
xhr.send(null);// 注:若服务器返回的MIME类型是text/plain,通过overrideMimeType重写为 text/xml 类型,便于处理

进度事件:

// loadstart: 在接收到相应数据的第一个字节时触发
// progress: 在接收响应期间持续不断地触发
// error: 在请求发生错误时触发
// abort:在因为调用abort()方法而终止连接时触发
// load: 在接收到完整的响应数据时触发
// loadend: 在通信完成或者触发error、abort或load事件后触发// load事件
var xhr = creatXHR();
xhr.onload = function() {if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.stauts);}
};
xhr.open("get", "altevents.php", true);
xhr.send(null);// progress事件
var xhr = createXHR();
xhr.onload = function(event) {if ((xhr.status >=200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);
};
xhr.onprogress = function(event) {var divStatus = document.getElementById("status");if ( event.lengthComputable) {divStatus.innerHTML = "Received " + event.position + " of" + event.totalSize + " bytes" ;}
};
xhr.open("get", "altevents.php" , true);
xhr.send(null);// 注1:onprogress事件会在浏览器接收新数据期间周期性地触发,其事件处理程序会接收到一个event对象
// 注2:event对象有3个属性:
//                       lengthComputable:表示进度信息是否可用的布尔值
//                       postion:已经接收到的字节数
//                       totalSize:根据Content-Length响应头部确定的预期字节数

跨域资源共享: (Cross-Origin Resource Sharing,CORS)是W3C的一个工作草案,定义了在 必须访问跨域资源时,浏览器与服务器应该如何沟通.

// 首先要明确简单请求的概念,满足以下条件:
// (1)请求方法是HEAD、GET、POST之一
// (2)HTTP头部不超过以下几种字段:
//    ·Accept:告诉服务器能够发送哪些媒体类型
//    ·Accept-Language:告诉服务器能够发送哪些语言
//    ·Content-Language:理解主体时最适宜使用的自然语言
//    ·Last-Event-ID:   ...未找到
//    ·Content-Type:(只限于application/x-www-form-unlencoded、multipart/form-data、text/plain)// 对于简单请求,在头信息中,增加一个Origin字段
GET /cors HTTP/1.1
Origin: http://api.bob.com               // 用于说明本次请求来自哪个源(协议 + 域名 + 端口)
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0 ...// 如果Origin指定的源,不在许可范围内,服务器会返回一个正常(注意是正常的)的HTTP.
// 当浏览器发现响应报文中没有Access-Control-Allow-Origin字段.就知道请求出错了,从而调用xhr.onerror事件处理函数
// 如果Origin指定的源的域名在许可范围内,服务器返回响应,响应首部多出几个字段如下:
Access-Control-Allow-Origin: http://api.bob.com        // 表示接收该域源的请求
Access-Control-Allow-Credentials: true                 //  表示是否允许发送Cookie
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset = utf-8

IE对CORS的实现: 微软在IE8中引入了XDR类型,用于实现安全可靠建的跨域通信

var xdr = new XDomainRequest();
xdr.onload = function () {alert(xdr.responseText);
};
xdr.onerror = function () {alert("An error occurred.");
}
xdr.open("get", "http://www.somewhere-else.com/page/");
xdr.send(null);// 注:通过xdr方法请求的数据,没有响应码,只有error事件.// xdr的contentType属性,用来表示发送数据的格式
var xdr = new XDomainRequest();
xdr.onload = function() {alert(xdr.responseText);
};
xdr.onerror = function () {alert("An error occurred.");
};
xdr.open("post", "http://www.somewhere-else.com/page/");
xdr.contentType = "applicatin/x-www.form-urlencoded";
xdr.send("name1=value1&name2=value2");

其他浏览器对CORS的实现:

// 使用原生的XHR对象,在传入url的时候,传入绝对URL即可.
var xhr = createXHR();
xhr.onreadystatechange = function() {if (xhr.readyState == 4) {if ((xhr.status >=200 && xhr.status < 300) || xhr.status == 304) {alert(xhr.responseText);} else {alert("Request was unsuccessful: " + xhr.status);}}
};
xhr.open("get", "http://www.somewhere-else.com/page/", true);
xhr.send(null);

跨浏览器的CORS:

// 检测XHR是否支持CORS的最简单方式,就是检查是否存在withCredentials属性.再结合检测XDomainRequest对象是否存在,即可实现兼容.
function createCORSRequest (method, url) {var xhr = new XMLHttpRequest();if ("withCredentials" in xhr) {xhr.open(method, url, true);} else if ( typeof XDomainRequest != "undefined") {xhr = new XDomainRequest();xhr.open(method, url);} else {xhr = null;}return xhr;
}
var request = createCORSRequest("get", "http://www.somewhere-else.com/page/");
if(request) {request.onload = function () {// 对 request.responseText 进行处理};request.send();
}

参考《JavaScript高级程序设计》(第3版)P578~P586
参考 阮一峰-跨域资源CORS详解
参考 《HTTP权威指南》P73、 P76

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES5-拓展 this指向的总结

每个函数在执行时都有自己的this指向 1. 默认绑定规则&#xff1a; 全局中&#xff0c;this指向window this window函数的独立调用&#xff0c;this默认指向window &#xff08;不要把独立调用理解成window调用&#xff09; // 函数在全局中调用&#xff0c;也就是被window调…

Applet

Applets用于为Web应用程序提供交互功能&#xff0c;这些功能无法单独由HTML提供。它们可以捕获鼠标输入&#xff0c;并且还具有按钮或复选框等控件。响应于用户动作&#xff0c;小应用程序可以改变提供的图形内容。这使得小程序非常适合演示&#xff0c;可视化和教学。 一个app…

国内初创企业选择云计算服务器价格对比

假设我们是一家初创企业&#xff0c;现在要选择第一台服务器。业务还未确定&#xff0c;只知道是互联网业务 要求&#xff1a; 至少2核&#xff0c;否则多线程的软件都跑不了至少4G内存&#xff0c;这样可以运行数据库或者elasticsearch这种比较吃内存的东西。或者说&#xff0…

javascript --- 几个其他的跨域技术(图像Ping、JSONP、Comet)

在CORS(Cross-Origin Resource Sharing,跨域资源共享)出现以前,要实现跨域Ajax通信是很难的. 可以利用DOM中能够执行跨域请求的功能,来实现跨域通信: 浏览器到服务器的单向通信: 此项技术称为图像Ping,利用的是img.src的跨域事件 img.src只能通过侦听load和error事件来确定浏览…

ES5-拓展 箭头函数的this、this的优先级

让内部函数的this指向和父函数的this&#xff0c;可以显示改变this指向&#xff0c;也可以使用箭头函数 箭头代替了function关键字 箭头函数内部没有this指向&#xff0c;箭头函数的this是稳定引用父作用域的。因为它的存在就是要稳定this指向。 适用于普通函数的所有绑定规则…

java 实现压缩单个文件

先来实现一个简单的单文件压缩&#xff0c;主要是为了解一下压缩需要使用到的流。。 效果&#xff1a; 说明&#xff1a;压缩实现使用ZipOutputStream 代码&#xff1a; package com.gx.compress;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im…

jekins构建触发器详解

jenkins版本&#xff1a;2.89.2 1、触发远程构建 (例如,使用脚本)&#xff1a;通过一个网址的访问来触发构建&#xff0c;这样就不需要登录jenkins系统也能触发构建了。 示例地址&#xff1a; http://localhost:8848/job/FlashRegistration/build??token口令&cause书写构…

http --- 前端的缓存

前端的缓存分为: http缓存 和 浏览器缓存 http缓存: // 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有"要请求资源"的副本 // 就会从浏览器缓存中提取而不是从原始服务器中提取这个资源// 常见的http缓存,只能缓存get请求响应的资源,对于其他类型的响…

ES5-拓展 隐式数据类型转换

Boolean转换原则&#xff1a;非假即真 6种虚值 原始值转换为原始值 对象转换为原始值 Date()和new Date() new Date可以不写括号(new方式返回的一定是对象)&#xff0c;返回Date对象Date()返回函数执行&#xff0c;返回时间字符串 引用值转原始值 先找valueOf方法(一般…

Swagger的简单入门【转载】

一、Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持&#xff0c;这篇文章我们继续讨论这个话题&#xff0c;不过&#xff0c;我们这里不再讨论Restful API如何实现&#xff0c;而是讨论Restful API文档的维护问题。 在日常的工作中&#xff0c;我们往往需要给前…

visual studio code搭建本地服务器(node.js+express)

一、安装node.js&#xff08;常规软件安装流程&#xff0c;比较简单&#xff0c;不用赘述&#xff09; 二、安装express框架 1. 打开Windows命令提示符&#xff0c;输入&#xff1a; npm install express -g&#xff0c;等待&#xff0c;安装好如下所示&#xff1a; npm instal…

es6 --- 手写一个promise

一个promise实例: var getJSON function(url) {var promise new Promise(function(resolve, reject) {// XHR对象发现ajax请求var client new XMLHttpReqeust();client.open("GET", url);client.onreadystatechange handler;client.responseType "json&qu…

最大流模版 EK

EK算法基于增广路的思想,易于理解,但由于低效并不被经常使用 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> using namespace std; const int MAXN10005,MAXM100005…

Restrictions查询用法

Restrictions查询用法 HQL运算符 QBC运算符 含义 Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictions.gt() 大于greater than > Restrictions.ge() 大于等于greater than or equal < Restrictions.lt() 小…

chrome调试

技术拓展直播课8 按chrome的官方文档 长按刷新 清除缓存&#xff08;不一定好使&#xff09; Ctrl f 查找类 console控制台见b站 bilibili source面板直接打断点 效果和debugger一样 单步调试 进入到函数的下一步 网速 no throttling 是否需要过滤 domcontentloaded d…

es6 --- promise和async/await的区别

首先需要了解async函数: async是Generator函数的语法糖: // 使用Generator依次读取两个文件 var fs require(fs); var readFile function (fileName) {return new Promise(function (resolve, reject) {fs.readFile(filename, function(error, data) {if (error) return re…

Ueditor百度编辑器中的 setContent()方法的使用

百度编辑器Ueditor所提供的setContent()方法作用是&#xff1a;设置或者改变编辑器里面的文字内容或html内容 函数说明&#xff1a;setContent(string,boolean); 参数string 是需要设置到编辑器里面的内容&#xff0c;可以含有HTML代码&#xff0c;最后插入到编辑器中的内容是经…

小程序UI

从input组件说起 <input maxlength"10" placeholder"最大输入长度10" /> <div id"wrapper" disabled$"{{disabled}}">\n <p id"placeholder" class$"{{_getPlaceholderClass(placeholderClass)}}"…

61-1 认识webpack

认识webpack 面向过程开发的不便引入外部js执行顺序面向对象开发 加载多个文件耗时更多 增加了http请求 引入过多js变量来源不明 优化 使用前先import 但使用import语法需要借助工具webpack翻译为浏览器可以解析的语法安装node自动携带npmwebpack若没有全局安装 需要使用npx…

css font简写

一、字体属性主要包括下面几个 font-family&#xff0c;font-style&#xff0c;font-variant&#xff0c;font-weight&#xff0c;font-size&#xff0c;fontfont-family&#xff08;字体族&#xff09;: “Arial”、“Times New Roman”、“宋体”、“黑体”等;font-style&…