ajax以及跨域《javascript高级程序设计笔记》

2016-08-21  本文已影响114人  进击的前端

21.1 XMLHTTPRequest

var xhr = new XMLHttpRequest();
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", "example.php", false);
xhr.setRequestHeader("MyHeader", "MyValue"); //可以选择不发送
xhr.send(null);

Accept:浏览器能够处理的内容类型。
Accept-Charset:浏览器能够显示的字符集。
Accept-Encoding:浏览器能够处理的压缩编码。
Accept-Language:浏览器当前设置的语言。
Connection:浏览器与服务器之间连接的类型。
Cookie:当前页面设置的任何Cookie。
Host:发出请求的页面所在的域 。
Referer:发出请求的页面的URI。注意,HTTP 规范将这个头部字段拼写错了,而为保证与规
范一致,也只能将错就错了。(这个英文单词的正确拼法应该是referrer。)
User-Agent:浏览器的用户代理字符串。

var myHeader = xhr.getResponseHeader("MyHeader");
var allHeaders = xhr.getAllResponseHeaders();

XMLHttpRequest 2

var data = new FormData(document.forms[0]);
//或者
var form = document.getElementById("user-info");
xhr.send(new FormData(form));
xhr.overrideMimeType("text/xml");

进度事件

var xhr = createXHR();
xhr.onload = function(){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
    alert(xhr.responseText);
  } else {
    alert("Request was unsuccessful: " + xhr.status);
  }
};
xhr.open("get", "altevents.php", true);
xhr.send(null);

跨源资源共享

var xdr = new XDomainRequest();
xdr.onload = function(){
   alert(xdr.responseText);
};
xdr.onerror = function(){
   alert("An error occurred.");
};
xdr.timeout = 1000;
xdr.ontimeout = function(){
   alert("Request took too long.");
};
xdr.open("get", "http://www.somewhere-else.com/page/");
xdr.contentType = "application/x-www-form-urlencoded";
xdr.send(null);

其他跨域技术

利用DOM 中能够执行跨域请求的功能,

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

除了Ajax之外

CSRF

对于未被授权系统有权访问某个资源的情况,我们称之为CSRF(Cross-Site Request Forgery,跨站点请求伪造)。未被授权系统会伪装自己,让处理请求的服务器认为它是合法的。受到CSRF 攻击的Ajax程序有大有小,攻击行为既有旨在揭示系统漏洞的恶作剧,也有恶意的数据窃取或数据销毁。
为确保通过XHR 访问的URL 安全,通行的做法就是验证发送请求者是否有权限访问相应的资源。
有下列几种方式可供选择。

请注意,下列措施对防范CSRF 攻击不起作用。

XHR 对象也提供了一些安全机制,虽然表面上看可以保证安全,但实际上却相当不可靠。实际上,前面介绍的open()方法还能再接收两个参数:要随请求一起发送的用户名和密码。带有这两个参数的请求可以通过SSL 发送给服务器上的页面,如下面的例子所示。

xhr.open("get", "example.php", true, "username", "password"); //不要这样做!!

总结

Ajax 是无需刷新页面就能够从服务器取得数据的一种方法。关于Ajax,可以从以下几方面来总结
一下。

上一篇 下一篇

猜你喜欢

热点阅读