摘要
本文部分内容来源于网络,个人收集整理,请勿传播
https://www.cnblogs.com/wupeiqi/articles/5703697.html
jQuery Ajax
jQuery其实就是一个JavaScript
的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能。
jQuery
不是生产者,而是大自然搬运工。jQuery Ajax
本质XMLHttpRequest
或ActiveXObject
注:2.+版本不再支持IE9以下的浏览器
jQuery Ajax 方法列表
1 | jQuery.get(...) |
基于jQueryAjax - Demo
1 | <!DOCTYPE html> |
iframe伪造ajax
1 | <iframe id="ifm0" src="http://www.baidu.com" frameborder="0"></iframe> |
跨域AJAX
由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。
特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接受罢了。
浏览器同源策略并不是对所有的请求均制约:
- 制约:
XmlHttpRequest
- 允许:
img、iframe、script
等具有src属性的标签
跨域,跨域名访问,如:
http://www.c1.com
域名向http://www.c2.com
域名发送请求。
JSONP实现跨域请求
浏览器默认是不允许ajax的跨域请求的,但是允许script标签的src属性进行跨域请求。
而利用script标签的src属性来达到跨域请求的模式就叫做JSONP
(JSONP - JSON with Padding
是JSON的一种”使用模式”)
- 创建script标签
- src添加远程地址
- 返回的数据必须是js格式
- 只能发get请求
1 | <!DOCTYPE html> |
CORS
随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing
),其本质是设置响应头,使得浏览器允许跨域请求。
简单请求 OR 非简单请求
- 条件
- 请求方式:HEAD、GET、POST
- 请求头信息
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type
对应的值是以下三个中的任意一个application/x-www-form-urlencoded
multipart/form-data
text/plain
注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求
简单请求和非简单请求的区别?
- 简单请求:一次请求
- 非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
关于”预检”
- 请求方式:OPTIONS
- “预检其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何”预检”
- 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则”预检”不通过
Access-Control-Request-Method
- 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则”预检”不通过
Access-Control-Request-Headers
- 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则”预检”不通过
基于cors实现AJAX请求
支持跨域,简单请求
服务器设置响应头:
Access-Control-Allow-Origin = '域名' 或 '*'
1 |
|
1 | class MainHandler(tornado.web.RequestHandler): |
支持跨域,复杂请求
- 由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。
- “预检”请求时,允许请求方式则需服务器设置响应头:
Access-Control-Request-Method
- “预检”请求时,允许请求头则需服务器设置响应头:
Access-Control-Request-Headers
- “预检”缓存时间,服务器设置响应头:
Access-Control-Max-Age
- “预检”请求时,允许请求方式则需服务器设置响应头:
1 |
|
Tornado
1 | class MainHandler(tornado.web.RequestHandler): |
跨域获取响应头
默认获取到的所有响应头只有基本信息,如果想要获取自定义的响应头,则需要再服务器端设置Access-Control-Expose-Headers
。
1 |
|
Tornado
1 | class MainHandler(tornado.web.RequestHandler): |
跨域传输cookie
在跨域请求中,默认情况下,HTTP Authentication
信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送。
- 如果想要发送:
- 浏览器端:XMLHttpRequest
的
withCredentials为
true` - 服务器端:
Access-Control-Allow-Credentials
为true
- 注意:服务器端响应的
Access-Control-Allow-Origin
不能是通配符 *
- 浏览器端:XMLHttpRequest
1 |
|
Tornado
1 | class MainHandler(tornado.web.RequestHandler): |
文件上传
选择的使用的时机
- 如果发送的普通数据 -> jquery、XMLHttpRequest、iframe
- 文件