图像Ping技术

根据一个网页可以从任何网页中加载图像而不用担心使用跨域的原理, 我们可以动态的创建图像, 使用他们的onload和onerror事件处理程序来确定是否收到响应。

动态的创建图像经常用于图像Ping。 图像Ping是与服务器进行简单的单向的跨域通信的一种方式。

请求的数据通过查询字符串形式发送的,而响应可以是任意内容, 但通常是像素图或者204响应

通过图像Ping,浏览器得不到任何具体的数据, 但是通过侦听loaderror事件, 它能知道是什么时候接受的。

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

图像Ping最常用于跟踪用户点击页面或动态广告曝光次数。

它有两个主要的缺点:只能发送get请求,无法访问服务器的响应文本。因此, 图像Ping只能用于浏览器与服务器间的单向通信。

JSONP

JSONP是JSON with padding的简写,是应用json的一种新方法,在后来的Web服务中非常流行。

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

JSONP由两部分组成:回调函数和数据。

回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指定的。数据就是传入回调函数的json数据。

下面是以个JSONP的例子:

http: //freegeoip.net/json/?callback=handleResponse //回调函数的名字就是handleResponse();

JSONP是通过动态的script元素来使用的,使用时可以为src属性指定一个跨域URL。这里的script元素有能力不受限制的同其他域加载资源。因为JSONP是有效地javascript代码,所以在请求完成后,即在JSONP响应加载到页面后会立即执行。

function handlerResponse(response) {alert("You're at IP address " + response.ip + ", where is in " + response.city + ", " + response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handlerResponse";
document.body.insertBefore(script, document.body.firstChild);

JSONP的优势:

在于简单易用,直接访问响应文本,支持浏览器与服务器之间的双向通信。

JSONP的不足之处:

不能确定加载的域是否安全,要确定请求失败并不容易。为了避免这些,开发人员的现行方案是用指定时间内是否接收到了响应来判断。

Comet

有两种实现Comet的方式:长轮询和流。

长轮询把传统轮询颠倒了一下,页面发送一个到服务器的请求,然后服务器一直保持连接打开,知道有数据可发送。发送完数据后,浏览器关闭连接,随即又发起一个到服务器的新请求。这个过程在页面打开期间一直不断持续。

第二种流行的Comet方式是HTTP流。流在页面的整个生命周期中只使用一个HTTP连接。具体来说就是浏览器向服务器发送一个请求,然后服务器保持连接打开,然后周期性的向浏览器发送数据。下面这段php脚本就是采用流实现的服务器中的常见方式:

$i = 0;
while (true) {echo "Number is $i"; //输出数据然后刷新缓存flush();sleep(10); //停止几秒$i++;
}

这段代码是实现HTTP流的关键。

下面这段代码是XHR对象实现HTTP流的典型代码:

function createStreamingClient(url, progress, finished) {var xhr = new XMLHttpRequest(),received = 0;xhr.open("get", url, true);xhr.onreadystatechange = function() {var result;if (xhr.readyState == 3) {result = xhr.responseText.substring(received);received += result.length;progress(result);} else if (xhr.readyState == 4) {finished(xhr.responseText);}};xhr.send(null);return xhr;
}
var client = createStreamingCilent("streaming.php", function(data) {alert("Received:" + data);
}, function(data) {alert("Done!");
});

这个createStreamingCilent函数接收三个参数:要连接的URL,在接收到数据时调用的函数以及关闭连接时调用的函数。

服务器发送事件

SSE( Server - Sent Events, 服务器发送事件) 是围绕只读Comet交互推出的API或者模式。 SSE API用于创建到服务器的单向连接, 服务器通过这个连接可以发送任意数量的数据。 服务器响应的MIME类型必须是text / event - stream, 而且是浏览器中的Javascript API能解析的格式输出。 SSE支持短轮询, 长轮询和HTTP流, 而且能够在断开连接时自动确定何时重新连接。

SSE API

SSE是为javascript api与其他传递消息的javascript api很相似。 要预定新的事件流, 要创建新的EventSource对象, 并传入一个入口点:

var source = new EventSource("myevents.php");

注意: 要传入的URL必须与创建对象的页面同源。 EventSource的实例有一个readyState属性, 值为0表示正连接到服务器, 值为1表示打开了连接, 值为2表示关闭连接。 另外还有三个事件:

  • open: 在建立连接时触发

  • message: 在从服务器接收到新事件时触发

  • error: 在无法建立连接时触发

服务器返回的数据以字符串的格式保存在event.data中。 如果想强制立即断开并且不再重新连接, 可以调用close() 方法。

事件流

多段数据发送时, 要以换行符进行分隔不同段的数据。 而且还可以在每段数据的前面或者后面附加ID, 以便多段数据的拼接。 在设置了ID之后, EventSource对象会跟踪上一次触发的事件。 如果连接断开, 会向服务器发送一个包含名为Last - Event - ID的特殊HTTP头部请求, 以便服务器知道下次触发那个事件。 在多次连接的事件流中, 这种机制保证了浏览器能够以正确的顺序接收到连接的数据段。

Web Sockets

在js中web sockets使用了自定义的协议。 未加密的协议是ws: //;加密的协议是wss://.目前支持它的的浏览器有FireFox6+,safari5+,Chrome,IOS4+版safari。

创建web sockets的例子:

var sockets = new WebSockets("ws://www.example.com/server.php");

注意, 必须给WebSockets构造函数传入绝对的URL。 同源策略对它不适用。 能否与特定的域通信完全取决于服务器。

sockets.close(); //关闭
sockets.send("Hello word"); //可以发送字符串,json格式的字符串

sockets的事件有onmessage: 服务器向客户端发送消息, sockets会触发; onopen: 成功建立连接时触发; onerror: 在发生错误时触发, 连接时不能持续; onclose: 在连接关闭时触发。 在close事件中的event对象有三个额外的属性: wasClean, code, reason.第一个参数表示连接是否明确的关闭, 布尔值。 第二个是服务器返回的数值状态码, 而reason是一个字符串, 包含服务器返回的信息。

Web Sockets协议比同于HTTP, 现有的服务器不能用Web Sockets通信, HTTP可以满足要求。 如果只需要向服务器请求数据, 那么SSE比较容易, 要是双向的通信Web Sockets更好一些。 在不能使用Web Sockets的情况下, 组合XHR + SSE也能实现双向通信。

在AJAX安全方面, 下列措施是得力的:
要求以SSL连接来访问可以通过XHR请求的资源
要求每一次请求都要附带经过相应算法计算得到的验证码

JavaScript Ajax与Comet——“其他跨域技术”的注意要点相关推荐

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

    在CORS(Cross-Origin Resource Sharing,跨域资源共享)出现以前,要实现跨域Ajax通信是很难的. 可以利用DOM中能够执行跨域请求的功能,来实现跨域通信: 浏览器到服务 ...

  2. JavaScript第二十二章 跨域资源共享

    什么叫跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 资源跳转: A链接.重定向.表单提交 资源嵌入: . 什么是同源策略? 同源策略/SOP(Sam ...

  3. 【Ajax】Ajax全面讲解、跨域与JSONP及了解HTTP

    Ajax 一.初识Ajax 1.1 URL地址 1.1.1 URL地址组成部分 1.2 客户端与服务器的通信过程 1.3 网页中如何请求数据 1.4 资源的请求方式 1.5 Ajax的概念 1.6 j ...

  4. php p3p跨域登录,php+ajax实现多域名跨域登录例子(基于P3P)

    在以前如果我们要实现php+ajax实现多域名跨域登录的话很多朋友都碰到无法正常跨域登录问题,下面我来给大家解决跨域名登录问题,有需要的参考. 该同步登陆需求需满足以下三个关键点: 1)A域名下登陆的 ...

  5. 一头扎进httpclient企业跨域技术从零基础到大神实战案例

    一头扎进httpclient企业跨域技术从零基础到大神实战案例 一头扎进httpclient企业跨域技术从零基础到大神实战案例 一头扎进httpclient企业跨域技术从零基础到大神实战案例 下载地址 ...

  6. Ajax接触及对跨域的简单理解

    [Ajax] Ajax技术能够向服务器请求额外的数据而无须卸载页面能带来更好的用户体验. Ajax技术的核心是XMLHttpRequest对象(简称XHR),XHR向服务器发送请求和解析拂去其响应提供 ...

  7. fetch ajax cros,由 Fetch 跨域 看 CORS

    最近在看 react 获取服务器数据时, 看到了一新的 API fetch, 上手来用了用,觉得十分好用.但是使用的过程中遇到了一些问题,还是决定整体的记录下. fetch 类似于 Ajax, 区别自 ...

  8. ajax 设置Access-Control-Allow-Origin实现跨域访问

    版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载可私信或关注公众号fdipzone-idea与我联系. https://blog.csdn.net/fdipzone/article/det ...

  9. 从零开始学 Web 之 Ajax(七)跨域

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

最新文章

  1. 社交网络图挖掘1--将社交网络看作图及其聚类
  2. Science发布2021年度十大科学突破榜单:除了AlphaFold2,还有哪些大丰收?
  3. python项目超级大脑-python项目之超级大脑
  4. UA MATH564 概率论 QE练习题2
  5. 一种加速WiFi模块一键配网速度的实现
  6. 小程序 webview 分享_新的一周,分享15个好玩的小程序
  7. python 生成pdf页面大小_(Python)更改使用xtopd生成的PDF文件的页面大小和格式
  8. 随机二次元新浪图床api源码
  9. 分享平时工作中那些给力的shell命令
  10. 如何用1年时间获得3年成长?
  11. Qt与Matlab混合编程细节总结
  12. 别人连不上_手机能连上wifi,笔记本电脑确连不上,显示无internet,安全,该怎么办?...
  13. 异常详细信息: System.Web.HttpException: 服务器太忙
  14. 渗透测试漏流程(PTES)
  15. SQL语句简单增删改查
  16. 计算机无法进去系统,开机进入bios无法进入系统怎么办_电脑开机就进入bios的解决方法...
  17. VC++6.0 win32 控制台应用程序 简单应用 附代码
  18. Linux下C程序的编辑,编译和运行以及调试
  19. 如何在手机上将图片转换为文字
  20. 蜂鸣器电路中有大内容

热门文章

  1. java 2017腾讯面试题_腾讯2017刁难面试题,是不是大神就看你会做几题
  2. mysql grant all privileges_MySQL数据备份及还原(一)
  3. matlab人口增长线性回归拟合_matlab中的线性拟合-98529851
  4. oracle 百万数据存储,jdbc oracle 百万级数据量存储
  5. 快速入门 Pinia 状态管理库
  6. settimeout(fn(),0)
  7. 怎么改python系统路径_动态修改python系统路径
  8. 安卓判断服务器返回的状态码,关于服务器返回的十四种常见HTTP状态码详解
  9. 使用MyBatis框架连接MySQL数据库查询记录,全部步骤
  10. 20200507:力扣151周赛下