跨域 Ajax 其他可选技术 异步
最早的跨域方法之一就是使用这个,任何域的<img>和<script>元素都可以随便加载。
var img = new Image();
img.onload = img.onerror = function(){
alert(“Done!”);
};
img.src = “http://www.example.com/test?name=Nicholas”;
数据通过查询字符串的形式发送,返回的可能是任何东西,通常是一像素的图片或者204响应。缺点就是只能使用get方式并且无法获得响应数据。所以通常用于单向从浏览器发送数据给服务器。
JSONP(动态生成script)
全称JSON with padding ,是JSON的变形,它看起来就像JSON除了数据被一个函数调用的东西包裹着:
callback({ “name”: “Nicholas” });
当收到响应的时候,就会调用页面上的callback函数。因为JSONP是有效的JavaScript,当JSONP的响应输出到页面上后就会立刻执行。
function handleResponse(response){
alert(“You’re at IP address “ + response.ip + “, which is in “ +
response.city + “, “ + response.region_name);
}
var script = document.createElement(“script”);
script.src = “http://freegeoip.net/json/?callback=handleResponse”;
document.body.insertBefore(script, document.body.firstChild);
比起用image,可以从响应里获得数据了。问题是可以注入邪恶脚本。其次是很难检测是否失败了,虽然HTML5给script定义了onerror事件,但浏览器支持不好。只能用定时检测在一段时间里是否受到了响应
Comet
服务器给页面推送数据,而不是页面向服务器请求数据,这种方式让信息能够更接近实时,例如比赛分数,股票价格等。
comet有实现两种方式,long polling和streaming
long polling
相对于传统的polling(short polling),浏览器定时请求服务器看有没有新数据,服务器不管有没有可用数据都马上返回响应。而long polling等待有可用数据的时候才返回响应,浏览器收到响应后马上发起新的请求。
优点就是使用xhr对象配合setTimeOut就可以了。只需要管理什么时候发送请求。
第二种方式是HTTP streaming
它是指使用单一个请求在整个页面的生存周期里,浏览器向服务器发送一个请求然后服务器保持这个链接不断,周期性地向浏览器推送数据。因为服务器端的语言都支持把数据写到输出缓存里,然后flush给客户端,因此这就是HTTP streaming的核心了。
举例:
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){
//get only the new data and adjust counter
result = xhr.responseText.substring(received);
received += result.length;
//call the progress callback
progress(result);
} else if (xhr.readyState == 4){
finished(xhr.responseText);
}
};
xhr.send(null);
return xhr;
}
var client = createStreamingClient(“streaming.php”, function(data){
alert(“Received: “ + data);
}, function(data){
alert(“Done!”);
});
1、server-sent events
这是一个针对只读comet交互的接口,这个接口建立了和服务器的单向链接(当然你可以配合xhr来实现双向通信),服务器响应的时候必须包含一个MIME类型为text/event-stream,输出的信息以一种指定的给浏览器。这个接口支持short polling,long polling和HTTP streaming,它会自动重新连接当原连接断开时。
var source = new EventSource(“myevents.php”);
地址必须是同域的,和调用该对象所在域一致,该对象实例也有readystate属性:
0 代表正在连接服务器
1 代表链接打开
2 代表链接关闭
有三个事件:
open 当链接建立时触发
message 当从服务器收到新事件时触发
error 当无法建立连接触发
source.onmessage = function(event){
var data = event.data; 从服务器传回来的信息以字符串的形式保存在data属性里
//do something with the data
};
默认地,当和服务器的连接被关闭, EventSource 会重新连接,可以通过close方法断开连接,禁止重新连接
source.close();
服务器发送的事件带上MIME类型为 text/event-stream,以long-lasting HTTP响应返回。
格式如下:
data: foo
data: bar
data: foo
data: bar
每一个空格代表发送一个message事件,例如第三个message事件event.data 值为 “foo\nbar”
可以指定给事件加个ID标识:
data:foo
id: 1
这样在多个连接情况下,断开重连也能找到之前的位置咯
2、Web socket
目的是通过一个long-lasting链接来实现浏览器和客户端的双向沟通。
当建立这种连接的时候,一个HTTP请求发送给服务器初始化一个链接,当服务器响应时,该连接会从HTTP升级为Web socket协议。这意味着服务器需要是支持Web socket 协议的。
web socket普通连接为 ws://
安全连接为 wss://
好处是发送很小的数据,不受HTTP字节妨碍,使用小数据包让Web socket在移动应用很适合。
var socket = new WebSocket("ws://www.haha.com/server.php");
必须传入绝对地址,可以跨域,完全由服务器决定是否和请求域建立连接。
浏览器会尝试建立连接当WebSocket对象被实例化以后。类似xhr,它也有一个readystate属性,只是值不同:
0 正在建立连接
1 连接已经建立好
2 连接开始关闭
3 连接已经关闭
Websocket是没有readystatechange事件的,但有相对不同状态的处理事件。你可以使用close来关闭链接
socket.close();
调用close,readystate马上变为2最后变为3
发送数据给服务器:
socket.send(“haha");
因为Web socket只能发送plain text,你需要把复杂数据结构先序列化:
var message = {
time: new Date(),
text: “Hello world!”,
clientId: “asdfp8734rew”
};
socket.send(JSON.stringify(message));
当服务器像客户端发送信息时,会触发message事件,返回的数据也是字符串,需要手动解析:
var data = event.data;
//do something with data
};
Web socket只能用Dom 0事件添加方式:
socket.onopen = function(){
alert(“Connection established.”);
};
socket.onerror = function(){
alert(“Connection error.”);
};
socket.onclose = function(){
alert(“Connection closed.”);
};
只有close事件有额外信息在event对象里:
wasClean属性: 布尔值,表示链接是否被干净地关掉
code:服务器返回的状态代码,数字
season:服务器发送的字符串
socket.onclose = function(event){
console.log(“Was clean? “ + event.wasClean + “ Code=” + event.code + “ Reason=”
+ event.reason);
};
安全问题
1、浏览器和服务器可以接入修改URL,例如:/getuserinfo.php?uid=6,没办法阻止别人把uid改成别的,因此 getuserinfo.php需要做进一步验证
2、当一个未经授权的系统能够进来获取资源的时候,就意味着发生了跨网站请求伪造(csrf)攻击。
预防就是验证该请求发送发之前接入过这个资源:
方法1:要求请求资源时带有SSL证书
方法2:要求每个请求带上一个用来计算的taken
document.domain = 'a.com';var ifr = document.createElement('iframe');ifr.src = 'http://script.a.com/b.html';ifr.style.display = 'none';document.body.appendChild(ifr);ifr.onload = function(){ var doc = ifr.contentDocument || ifr.contentWindow.document; // 在这里操纵b.html alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);}; 跨域 Ajax 其他可选技术 异步的更多相关文章
- Ajax与跨域Ajax
Ajax 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上.对于传统的Web应用,一个简单操作需 ...
- 06: AJAX全套 & jsonp跨域AJAX
目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...
- 使用$.getJSON实现跨域ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- 跨域资源共享(CORS)--跨域ajax
几年前,网站开发者都因为ajax的同源策略而撞了南墙.当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时,我们很快发现没有一个方法可以使我们用JavaScript实现请求跨域访 ...
- 第二百七十四节,同源策略和跨域Ajax
同源策略和跨域Ajax 什么是同源策略 尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...
- 用JQuery的$.getJSON发起跨域Ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- 在django中解决跨域AJAX
由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...
- 跨域Ajax请求WebService方法
一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...
- 跨域Ajax请求 web.config文件配置
在web.config文件的<system.webServer>节点下面添加如下配置代码:<!--允许跨域ajax访问--> <httpProtocol> < ...
随机推荐
- 深入理解String的关键点和方法
String是Java开发中最最常见的,本篇博客针对String的原理和常用的方法,以及String的在开发中常见问题做一个整体性的概括整理.因为之前对String的特性做过一些分析,所以不在详细描述 ...
- oracle数据库备份、还原 (如何将Oracle 11g备份的dat文件导入到10g数据库里面)
如何将Oracle 11g备份的dat文件导入到10g数据库里面 解决方法: 导出的时候后面加上目标数据库的版本号 导出: 在SQL plus下执行:create or replace ...
- 简易RPC框架-过滤器机制
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 从头编写 asp.net core 2.0 web api 基础框架 (2)
上一篇是: http://www.cnblogs.com/cgzl/p/7637250.html Github源码地址是: https://github.com/solenovex/Building- ...
- apache一个ip多个端口虚拟主机
1.打开httpd.conf,查找Listen:80,在下面一行加入Listen:8080:2.查找#Include conf/extra/httpd-vhosts.conf,将此行前面的#去掉:3. ...
- CentOS7.3下部署Rsyslog+LogAnalyzer+MySQL中央日志服务器
一.简介 1.LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从数据库或一般的syslog文本文件中 ...
- 学习如何看懂SQL Server执行计划(一)——数据查询篇
一.数据查询部分 1. 看到执行计划有两种方式,对sql语句按Ctrl+L,或按Ctrl+M打开显示执行计划窗口每次执行sql都会显示出相应的执行计划 2. 执行计划的图表是从右向左看的 3. SQL ...
- jsp web JavaBean MVC 架构 EL表达式 EL函数 JSTL
一.JavaBean概念(非常重要) 1.JavaBean就是遵循一定书写规范的Java类型(开发中:封装数据) a.必须有默认的构造方法,类必须是public的 public class ...
- 扩展js,实现c#中的string.format方便拼接字符串
//"{0}-{1}-{2}".format("xx","yy","zz") //显示xx-yy-zz String.p ...
- Kettle文本文件输出和输入控件使用中,换行符导致的问题处理
1.如下图通过输入控件从数据库读取数据然后生成TXT文本文件,TXT文件生成原则是每一条数据生成一行数据,第二条数据换行保存 2.如下图所示,使用文本文件输入控件读入上图生成的文件,文件读入原则是按行 ...