JavaScript/JQuery] AJAX机制详解以及跨域通信

本文详细介绍了Ajax的基本概念,核心对象XMLHttpRequest的使用方法,以及如何实现跨域请求。包括XMLHttpRequest对象的六个核心函数和五个属性,以及如何在不同浏览器中创建和使用XMLHttpRequest对象。此外,文章还探讨了单向跨域技术CORS和JSONP的工作原理及其实现方法。

1.Ajax

1.1.Ajax简介
Ajax简介这一部分我们主要是谈一下ajax的起源,ajax是什么?因为这些是跟技术无关的。所以,大多细节都是一笔带过。

Ajax的起源?

  Ajax一词源于2005年 Jesse James Garrett发表的一篇题为"Ajax:A new Approach to Web Applications".他在这篇文 章中介绍了一种新技术,用他的话说,就是Ajax :Asynchronous JavaScript +XML的缩写。

Ajax是什么?

  这种新技术的主要目的就是为了使前端网页能够向服务器请求额外的数据而不需要卸载页面。自从这种技术出现以后,微软率先引入XHRt对象(ajax能够实现的核心对象),然后其他浏览器相继实现这种技术。总而言之,ajax就是一种能异步通信的技术。

1.2.Ajax的核心对象---XMLHttpRequest
因为IE5是最先引入这个XHR对象的,当时并没有事实上的标准。在IE中有三种不同的XHR对象版本:MSXML2.XMLHttp,MSXML2.XMLHttp.3.0和MSXML2.XMLHttp.6.0;

根据这三种版本号,在IE中创建一个XHR对象如下:

function createXHR() { //IE7之前的版本通过这种方式
var versions = [
'MSXML2.XMLHttp',
'MSXML2.XMLHttp.3.0',http://www.nvzi91.cn/zigongjiliu/30023.html
'MSXML2.XMLHttp.6.0'
];
var xhr = null;
for (var item in versions) {
try {
xhr = new ActiveXObject(item); //若不存在该版本,可能会出错
if (xhr) break;
} catch (e) {
//一般对这种错误不做处理
}
}
return xhr;http://www.nvzi91.cn/fujianyan/30024.html
}
在IE引入这个对象之后,其他浏览器厂商也相继跟随,这时候XHR对象成为事实上的标准!

跨浏览器创建XHR对象;

function createXHttpRequest() {
if (typeof XMLHttpRequest !== 'undefined') { //不要用 if(XMLHttpRequest){}这种形式,
return new XMLHttpRequest(); //如果是这种形式在找不到XMLHttpRequest函数的情况下,会报错。
} else if (typeof ActiveXObject !== 'undefined') { 
return createXHR(); //用到刚才我们创建的函数 
} else { throw new Error('不能创建XMLHttpRequest对象'); } }

1.2.XMLHttpRequest的用法
XMLHttpRequest对象的函数有6个:

  1. open("method",url,boolean);
  2. //该方法的三个参数,分别为----提交方式"get"或者"post"等
  3.                 //&& url是相对于执行代码的当前页面的路径(使用绝对路径是允许的)&&是否异步
  4. send();
  5. //这个方法接收一个参数,这个参数是作为请求主体发送的数据,
  6. //说明: 如果有参数,请使用post方式提交 使用方式如下,send("user="+username+"&pwd="+password);
  7. //如果没有参数,为了兼容性考虑,必须在参数中传入null,即send(null);该方式使用get方式提交
  8. abort(); //取消当前响应,关闭连接并且结束任何未决的网络活动。
  9. //这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决 //的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。
  10. getResponseHeader()http://www.nvzi91.cn/zigongnamoyan/30025.html
  11. //返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任 //何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。
  12. //该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyStat //e 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并 //返回,使用逗号和空格分隔开各个头部的值。
  13. getAllResponseHeaders()http://www.nvzi91.cn/gongjingmilan/30026.html
  14. //把 HTTP 响应头部作为未解析的字符串返回。
  15. //如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的
  16. //头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "\r\n" 隔开。
  17. setRequestHeader()
  18. //向一个打开但未发送的请求设置或添加一个 HTTP 请求。
复制代码

XMLHttpRequest对象的属性有5个:

属性 描述
responseText 作为响应主题被返回的文本
responseXML 如果相响应的是text/html或者application/xml类型的话,这个属性将保存着响应的XML文档
status http的响应状态码
statusText http状态的说明
readyState XMLHttpRequest对象的状态位 0 1 2 3 4 分别表示5种状态
timeout 设置超时时间,单位是ms.目前只有IE8+支持---尚未标准化(不推荐使用)

XMLHttpRequest对象的事件属性onReadyStateChange:-----所有浏览器兼容

该属性监听的是 XMLHttpRequest对象的readyState属性的变化:

readyState的变化分别对应如下状态:

0:尚未初始化。未调用open()之前

1:启动。调用open()之后,但是未调用send();

2:发送。调用send()但是尚未得到响应。

3:正在接收数据。刚接收到响应数据开始到接收完成之前。

4: 完成。数据接收完成。

  1. xhr.onreadystatechange = function () {
  2. if (xhr.readyState == 4) {
  3. if (xhr.status >= 200 && xhr.status <== 300 || xhr.status == 304) {
  4. alert(xhr.responseText);
  5. //处理接收的数据
  6. } else {
  7. //请求失败,未得到响应数据
  8. }
  9. }http://www.nvzi91.cn/fujianyan/30027.html
  10. }; //补充说明:注册事件必须发生在send()以前
复制代码

XMLHttpRequest对象的事件属性ontimeout -----仅限IE8+,不过最新的主流高版本浏览器也已经实现(不推荐使用)

xhr.timeout=1000;//一秒钟

xhr.ontimeout=functon(){
//处理代码
......
}
这种使用方式有个问题需要注意,就是在超时之后,在接收到数据后仍然会触发onreadystatechange事件,如果在处理onreadychange事件时访问xhr.status属性,会出错。所以我们在访问该属性时需要做一下try{}catch处理。但是,因为这个属性暂不兼容,所有我们就不重点讲了。

XMLHttpRequest对象的事件属性onload onerror onloadstar onbort onprogress:

-----非IE浏览器和IE 10+已实现

onload在IE8以上可以实现,大部分事件根据readySate变化均可以实现,以上事件只不过是方便使用而已。

onload和onprogress 这两种事件分别对应着readyState=4和readyState=3的情况,使用方式分别如下:

  1. xhr.onload= function (event) {
  2. //event只包含一个属性 event.target=xhr;使用方式只是在readyState=4时差不多..
  3. }
  4. xhr.onprogress=function(event){
  5. //event除了包含event.target=xhr之外,还包含三种属性
  6. //lengthComputale(进度信息是否可用),position(已接受字节数)和totalSize(总字节数).
  7. }
复制代码


补充:有些事件均可以根据readyState的状态进行模拟。只有有的浏览器进行了方便化处理而已。 

3.单向跨域技术 ---CORS
今天我们这里讲的是客户端网页向不在同一个域的服务器请求数据..客户端在收到返回的数据时时,用回调函数处理数据。

即:

1. 客户端向域外服务器请求数据

2.服务器得到响应后向客户端发送数据。

3.客户端根据返回的数据执行回调函数.

我知道不同域下的iframe也可以进行通信,而且这也是一种跨域通信技术。但是,这种iframe页面之间的双向通信,我们在下一个专题里面讲解,今天主要讲的是单向通信。

3.1.CORS跨域请求的原理
在用xhr(XMLHttpRequest)对象或者xdr(XDomainRequest)对象,发送域外请求时,大概的实现原理如下图:

3.2.IE中CORS技术的实现
IE8引入了一个XDR类型,这个类型与XHR基本类似,但是其能实现安全可靠地跨域通信。

XHD的特点:

1.cookie不会随请求发送,也不会随响应返回。

2.只能设置请求头部中的Content-Type片段。

3.不能访问响应头部信息。

4.只是支持get和post请求。

XDR支持onload和onerror事件属性,且其使用方式和XHR基本一致,不过其open()只接收两个参数,默认是异步的。

  1. var xdr = new XDomainRequest();
  2. xdr.onload = function () {
  3. //处理xdr.responseText
  4. }
  5. xdr.onerror = function () {
  6. };
  7. xdr.open('get', '绝对url');
  8. xhr.send(null);
复制代码

3.3.跨浏览器的CORS技术实现

在标准浏览器中XHR对象就已经可以自动实现跨域请求,但是XHR和XDR的不同之处:

1.XHR可以在设置 withCredentials =true时,浏览器会把cookie发送给服务器,服务器此时通过设置头部Access-Control-Allow-Credentials:true时来响应。如果,服务器不设置这个属性,则浏览器会触发onerror事件。

2.在回调函数中可以访问status和statusText属性,而且支持同步请求。

以下是实现跨域请求的代码:

  1. function createCrosRequest(method, url) {
  2. var xhr = new XMLHttpRequest(); //IE7+
  3. if ('withCredentials' in xhr) { //IE8-IE9浏览器没有这个属性
  4. xhr.open(method, url, true);
  5. } else if (typeof XDomainRequest != 'undefined') {
  6. xhr = new XDomainRequest(); //IE
  7. xhr.open(method, url)
  8. }
  9. return xhr;
  10. }
  11. var request=CreateCrosRequest("get","url");
  12. if(request){
  13. request.onload=function(){
  14. //处理request.responseText;
  15. }www.nvzi91.cn
  16. request.send(null);
  17. }
复制代码

4.单向跨域技术 ---JSONP技术

JSONP技术比较简单,其主要原理主要是利用script标签的特性。

script标签和image标签一样,它们都具有src属性,而且这个属性是可跨域的。

因为script标签返回的都是js代码,且该js代码会自动执行。所以,如果我们请求返回的数据也是类似一段js代码的形式,岂不是就可以实现在脚本加载完毕后自动执行。

如果我们的请求,返回的数据是 callback + '(' + json + ')'; 这种形式的数据, 那么在脚本加载完毕之后也就能自动执行callback()函数了.

4.1.客户端写法

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5. </head>
  6. <body>
  7. <button id="button">请求数据</button>
  8. </body>
  9. <script>
  10. window.onload=function(){
  11. var button=document.getElementById("ibutton");
  12. function callback(data){
  13. //处理data
  14. }
  15. button.onclick=function(){
  16. var script=document.createElement("script");
  17. script="http://www.sasd.com/json/?callbak=callback";
  18. document.body.insertBefore(script,document.body.firstChild);//加载脚本
  19. }
  20. }
  21. </script>
  22. </html>
标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值