js-其他跨域技术(JSONP`Comet)
###1. JSONP
JSONP由两部分组成:回调函数和数据
JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL
eg:
function handelResponse(response){
alert('''......')
}
var script = document.createElement("script");
script.src = "http://..../json/?handelResponse" ;
document.body.insertBefore(script,document.body.firstChild);
缺点:JSONP是从其他域中加载代码执行 要确定JSONP请求是否失败并不容易
###2. Comet(“服务器推送”)
Comet 是一种服务器向页面推送数据的技术,它本含两种方法:长轮询和流
1.)长轮询/短轮询,两者最大的区别在于服务器如何发送数据。短轮询是服务器立即发送响应,无论数据是否有效,而长轮询是等待发送响应。
无论是长轮询或短轮询,浏览器都要在接收数据前先发起对服务器的链接,且服务器在浏览器打开状态下一直保持连接打开
2.)HTTP流
浏览器向服务器发送一个请求,而服务器保持连接打开,然后周期性的向浏览器发送数据
eg:
function fn(url, prog ,finish){
var xhr = new XMLHttpRequest();
var strNum = 0;
xhr.open("get",url,true);
xhr.onreadystatechange = function(){
var resulet ;
if(xhr.readyState == 3){
result = xhr.responseText.substring(strNum);
strNum += result.length;
prog(result);
}elset if(xhr.readyState == 4){
finish(xhr.responseText);
}
}
xhr.send(null);
return xhr;
}
var a = fn("xxx.php",function(data){
alert("Received:" +data)
},function(data){
alert("Done!");
});
###3.新增两个Comet接口
3.1)服务器发送事件(SSE)
SSE API用于创建到服务器的单向链接,服务器可以通过这个链接发送任意数量的数据。服务器相应的MIME格式必须是text/event-stream
MIME类型: 每当浏览器请求一个页面时,web服务器会在发送实际页面内容之前,先发送一些头信息;任何资源都有自己的MIME类型;
eg: Content-Type="text/event-stream" / <meta http-equiv="Content-Type" content="text/html";>
3.1.1)SSE API
JavaScript使用SSE:创建新的EventSource对象,并传入一个入口点:
var source = new EventSource("xxx.php");
传入的URL必须与创建对象的页面同源(相同的URL模式·域及端口)
该source实例对象含一个readyState属性, 0 为正连接到服务器;1表示打开了链接;2表示关闭了链接
及以下三个事件
open:在建立连接时触发
message:再从服务器接收到新事件时触发
source.onmessage = function(event){
var data = event.data; // 服务器发回的数据以字符串形式保存在event.data中
}
error:在无法建立连接是触发
强制断开链接: source.close();
3.1.2)事件流
3.2)Web Sockets
一个单独的持久连接上提供全双工·双向通信;
使用标准的HTTP服务器无法实现Web Sockets;
由于它使用了自定义的协议,所以URL模式也略有不同。未加密的不是http:// 而是 ws:// ; 加密的不是https:// 而是 wss://
3.2.1) 创建实例对象
var socket = new WebSocket("ws://www.xxx.com/abc.php");
传入的URL必须为绝对的,同源策略对它不适用。
实例化对象与XHR类似,websocket也有一个表示当前状态的readyState属性:
WebSocket.OPENING(0):正在建立连接
。。。.OPEN(1):已经建立连接
.CLOSING(2):正在关闭连接
.CLOSE(3):已经关闭
socket.close(); // 在任何时候可以调用该方法,关闭连接
3.2.2) 发送和接受数据
socket.send("xxx"); // 可传入任意字符串
WebSocket只能发送纯文本数据,因此在传送复杂数据之前,需进行序列化处理;
eg: // 传送一个json数据
var msg = {
"name" : "John",
"age": 23
}
socket.send(JSON.stringify(msg));
当服务器接收后并返回消息是,WebSocket对象会触发message事件,该事件与其他传递消息的协议类似,也将返回数据保存在event.data属性中
socket.onmessage = function(event){
event = event || window.event;
var data = event.data;
// 注意:event.data保存的数据与send发送的数据相同,都为字符串格式
...
}
3.2.3) 其他事件
open、erro、close(webCoean、code、reason)
js-其他跨域技术(JSONP`Comet)的更多相关文章
- 跨域技术-jsonp
JSONP是JSON with padding 的简写,其有两个部分组成,一个是回调函数,一个是数据,其基本格式如下 function handleResult(result){ alert(resu ...
- js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...
- JS跨域:jsonp、跨域资源共享、iframe+window.name
JS跨域:jsonp.跨域资源共享.iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html JS中的跨域 请求跨域有 ...
- 循序渐进Python3(十一) --6-- Ajax 实现跨域请求 jsonp 和 cors
Ajax操作如何实现跨域请求? Ajax (XMLHttpRequest)请求受到同源策略的限制. Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外 ...
- 跨域利器JSONP(转)
何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...
- 前端跨域解决方案: JSONP的通俗解说和实践
对于前端开发者而言,跨域是一个绕不开的话题.只有真正明白了各种方案的工作机制,才能针对性地进行跨域方案选型.本文将以探索者的视角,试图用最通俗的语言对一种"鼎鼎大名"的跨域解决方 ...
- jQuery(三) javascript跨域问题(JSONP解决)
加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...
- 浏览器同源策略,跨域请求jsonp
浏览器的同源策略 浏览器安全的基石是"同源政策"(same-origin policy) 含义: 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这 ...
- JS JSOP跨域请求实例详解
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...
随机推荐
- 【2018.05.10 智能驾驶/汽车电子】AutoSar Database-ARXML及Vector Database-DBC的对比
最近使用python-canmatrix对can通信矩阵进行编辑转换时,发现arxml可以很容易转换为dbc,而dbc转arxml却需要费一番周折,需要额外处理添加一些信息. 注意:这里存疑,还是需要 ...
- CSS多行文本垂直居中
今天需要将文本垂直居中,就是一行是垂直居中,多行也是垂直居中. 效果如下 实现代码(同事提供) <!DOCTYPE html> <html> <head lang=&qu ...
- linux中find命令高级用法
前言 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天我们介绍find命令的一些高级使用技巧.它能满足我们一些更加复杂的需求. 查找空文件或空目录 有时候需要 ...
- 《Java大学教程》—第6章 类和对象
6.2 对象:结构化编程-->数据-->封装(聚合,信息隐藏)-->对象(方法及其操作的数据都聚合在一个单元中,作为更高层的组织单元)-->类(创建对象的模板)6.3 类:* ...
- 小程序View内的文字不换行
今天发现View内的文字一行过去直接被屏幕右边吃掉,没有预期的换行,设置width也不管用,最后用它解决了 1. white-space:pre-line(不会保留空白和tabs) 2. white- ...
- python 代码检测工具
对于我这种习惯了 Java 这种编译型语言,在使用 Python 这种动态语言的时候,发现错误经常只能在执行的时候发现,总感觉有点不放心. 而且有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导 ...
- 设计模式のInterpreter Patern(解释器模式)----行为模式
一.问题产生背景 有一句话“小明和小龙是好朋友”,我想分析其中谁是人,我想分析他们的关系等多种需求,那么我们应该如何处理,如果为每一个关系都进行判断?显然不合适,我们可以将二者的关系进行抽象处理,然后 ...
- ElasticSearch(三):Java操作ElasticSearch索引之CRUD
package com.gxy.ESChap01; import java.net.InetAddress; import java.util.HashMap; import java.util.Ma ...
- UVA1616-Caravan Robbers(二分)
Problem UVA1616-Caravan Robbers Accept: 96 Submit: 946Time Limit: 3000 mSec Problem Description Lon ...
- stroop效应matlab实验
1 打开matlab,打开test1.m 点击运行,若出现选择 更改文件夹 2 引导界面 (在这个界面,只许用户鼠标点击开始,其余的别乱按按键. 记得将打字法关掉,切换到小写) 3 做题界面 根据颜 ...