什么是 XMLHttpRequest 对象?XMLHttpRequest 对象用于在后台与服务器交换数据。XMLHttpRequest 是 AJAX 的基础。XMLHttpRequest 对象是 W3C 的标准吗?任何 W3C 推荐标准均未规定 XMLHttpRequest 对象。AJAX请求和浏览器请求的区别?本质上,不管是Ajax还是浏览器请求,都是一次基于HTTP的一问一答过程。功能上,浏览器请求(js,css,图片,form表单提交)和Ajax请求都携带Cookie信息。但浏览器规定,静态资源请求和提交表单不受同源政策的限制,Ajax请求受同源策略限制。怎么区分ajax请求和浏览器请求?可以通过Request.IsAjaxRequest方法判断是否是ajax过来的请求,ajax发起的请求多一个协议头X-Requested-With:XMLHttpRequest。
XHR发送请求和接收响应:如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
// open方法规定请求的类型、URL 以及是否异步处理请求。// send方法将请求发送到服务器。data仅用于 POST 请求。var xhr = new XMLHttpRequest()xhr.open('GET', 'http://www.baidu.com?t='+Math.random(), true) xhr.setRequestHeader("Content-type","xxx") // 添加 HTTP 头xhr.send(data)如需获得来自服务器的响应,我们使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。如果来自服务器的响应并非 XML,请使用 responseText 属性。
readyState属性存有XMLHttpRequest对象的状态。从 0(请求未初始化) 到 4(请求已完成,且响应已就绪) 发生变化。status属性存有HTTP响应状态码,从1xx(hold on)到5xx(I fucked off)。每当 readyState 改变时,就会触发 onreadystatechange 事件。onreadystatechange 事件被触发 4 次(0 - 4), 分别是: 0-1、1-2、2-3、3-4。当readyState等于4且状态码为200 时,表示响应已就绪:xhr.onreadystatechange = function() {if (xhr.readyState ==4 && xhr.status==200) {console.log(xhr.responseText)} }最简单的解决跨域方法是JSONP:JSONP:只支持GET,不支持POST请求代理。由于JSONP是最灵活,也是最常用的方式原理:浏览器只对XHR(XMLHttpRequest)请求有同源请求限制,而对script标签src属性、link标签ref属性和img标签src属性没有这这种限制,利用这个“漏洞”就可以很好的解决跨域请求。JSONP就是利用了script标签无同源限制的特点来实现的,当向第三方站点请求时,我们可以将此请求放在标签的src属性里,这就如同我们请求一个普通的JS脚本,可以自由的向不同的站点请求:
function hello(res) {console.log(res); }上面代码执行后报如下错误:Cross-Origin Read Blocking (CORB) blocked cross-origin response https://www.baidu.com/?callba... with MIME type text/html
为什么浏览器要限制跨域访问?浏览器一直在做的假设是,任何时候只要用户开始使用互联网应用,这个应用就开始尝试攻击这个用户,也就是说互联网应用是默认不可信的。最早迫使浏览器采用不信任互联网应用这个设计思想的攻击方式,就是跨站点脚本攻击。跨站脚本攻击XSS(Cross Site Scripting)常见方式:1、通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行恶意代码。例如,当动态页面中插入的内容含有这些特殊字符(如