廖雪峰老师JS教程读书笔记(二):原生AJAX与跨域总结
来源:互联网 发布:网络新技术有哪些方面 编辑:程序博客网 时间:2024/05/22 01:39
廖老师网站原文
原生AJAX请求
//创建一个XMLHttpRequest对象var request=new XMLHttpRequest();//readystate发生change时会执行的回调函数request.onreadystatechange=function(){ if(request.readystate===4){ //请求完成 if(request.status===200){ //请求成功要执行的代码,通过responseText取请求回来的数据 }else{ //请求失败要执行的代码,通过status判断失败原因 } }else{ //还在请求中 }}//规定请求的配置,method为请求方法,url为请求路径,async为是否异步,不带此参数默认为true,request.open(method,url,async);//此时真正发送请求,data为发送的附带数据,没有要发的可以发送null,浏览器兼容好像会好一些。request.send(data || null)/*//如果不支持XMLHttpRequest对象,则需要创建ActiveXObject对象var request;if(window.XMLHttpRequest){ request=new XMLHttpRequest();}else{ request=new AcitveXObject(Microsoft XMLHTTP);}*/
跨域
同源政策:
相同域名,相同协议,相同端口(有的浏览器不要)。
要请求的url不符合同源政策,则需要跨域才能访问
跨域方法:
1. Flash插件
通过Flash插件发送请求,绕过浏览器安全限制,必须安装Flash并和Flash交互,而且现在Flash用的越来越少了。
2. 代理服务器
'/proxy?url=http://www.sina.com.cn'
在同源域名下架设代理服务器转发请求,js发送请求到这个代理服务器,代理服务器再把结果返回,麻烦在于需要在服务器端额外处理
3. JSONP
利用浏览器可以引用外域的JavaScript资源这个特性,在script标签中发送请求,接受回调,这种方法只能发送GET请求,且要求返回JavaScript,通常以函数调用的方式返回
具体实现:
//在页面中先写好回调函数var callbackFuncName=function(data){ //要执行的代码}var test=document.createElement('script');test.src=url; //url为要请求的地址,这里要注意!!!url最后一般带有callback字段,不一定是这个名字,这个是由服务器端代码决定的。总之这个字段的值为页面中定义的回调函数的函数名。之前所说的一般会返回函数调用,就是服务器端获取到callback字段后经过处理最后发送回来callback调用。document.getElmentsByTagName('head')[0].appendChild(test); //动态添加发送请求的script结点到head标签的最后,接受到返回为函数调用则立即调用callback
4. CORS
CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。
Origin为当前发送请求的页面所在的域,当它向外域发送请求时,外域发回的响应头中有一个Access-Control-Allow-Origin
字段,如果这个字段有请求页面的Origin,或者为*(所有页面都能请求),那么请求成功,否则失败。
关键在于对方服务器是否愿意给你设置正确的Access-Control-Allow-Origin
字段
简单请求:上面这种请求就是简单请求,简单请求包括GET、HEAD和POST(POST的Content-Type类型
仅限application/x-www-form-urlencoded、multipart/form-data和text/plain),并且不能出现任何自定义头(例如,X-Custom: 12345),通常能满足90%的需求。
复杂请求:对于PUT、DELETE以及其他类型如application/json的POST请求,在发送AJAX请求之前,浏览器会先发送一个OPTIONS请求(称为preflighted请求)到这个URL上,询问目标服务器是否接受:
OPTIONS /path/to/resource HTTP/1.1Host: bar.comOrigin: http://my.comAccess-Control-Request-Method: POST
服务器必须响应并明确指出允许的Method:
HTTP/1.1 200 OKAccess-Control-Allow-Origin: http://my.comAccess-Control-Allow-Methods: POST, GET, PUT, OPTIONSAccess-Control-Max-Age: 86400
浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,否则,抛出一个错误。
由于以POST、PUT方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理POST和PUT请求,服务器端必须正确响应OPTIONS请求。
- 廖雪峰老师JS教程读书笔记(二):原生AJAX与跨域总结
- 廖雪峰老师JS教程读书笔记(一):JS继承
- 廖雪峰老师JS教程读书笔记(三):attr()和prop()和is()
- 廖雪峰老师git教程笔记(1)
- 廖雪峰Git教程读书笔记
- 学习廖雪峰老师的课程笔记(二)
- git总结(根据廖雪峰教程)
- 【JavaScript】数据类型--廖雪峰JS教程【学习总结】
- DNS | Array | Object | Map | Set | iterable ---[廖雪峰老师js教程笔记]
- 根据廖雪峰老师的git教程,得出的个人总结
- 原生js实现AJAX(二)
- 《廖雪峰的Git教程》读书笔记
- jquery ajax跨域与原生JS的跨域
- git学习(廖雪峰git教程)笔记 二
- [笔记1]---廖雪峰老师的Git教程
- [笔记2]---廖雪峰老师的Git教程
- 廖雪峰git教程阅读之二
- 廖雪峰 Python教程 笔记 二
- String.split的坑
- 拉普拉斯金字塔融合
- JVM内存区域和GC策略-学习笔记
- TCP/UDP/HTTP攻击
- ApiDemos学习知识点之os-MorseCode(13)
- 廖雪峰老师JS教程读书笔记(二):原生AJAX与跨域总结
- 位运算
- MySql安装
- 2017年8月
- jquery实现日历选择功能
- 测试用例设计要点
- PAT 1018. public bike management (30)
- UVA442 Matrix Chain Multiplication【DP】
- 使用HttpGet 发送 json格式的参数