什么是ajax
AJAX即“Asynchronous JavaScript and XML”(非同步的JavaScript和XML)
传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求。服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向服务器发送请求,应用的回应时间依赖于服务器的回应时间。这导致了用户界面的回应比本机应用慢得多。
与此不同,AJAX应用可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的回应。因为在服务器和浏览器之间交换的数据大量减少,服务器回应更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web服务器的负荷也减少了。
一般的发送请求的方式
- 用 form 可以发请求,但是会刷新页面或新开页面
- 用 a 可以发 get 请求,但是也会刷新页面或新开页面
- 用 img 可以发 get 请求,但是只能以图片的形式展示
- 用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
- 用 script 可以发 get 请求,但是只能以脚本的形式运行
有没有什么方式可以实现,get、post、put、delete 请求都行,想以什么形式展示就以什么形式展示?
引入AJAX
- 使用 XMLHttpRequest 发请求
- 服务器返回 XML 格式的字符串
- JS 解析 XML,并更新局部页面
XMLHttpRequest对象
XMLHttpRequest对象用来在浏览器与服务器之间传送数据。
var ajax = new XMLHttpRequest();
ajax.open('GET', 'http://www.example.com/page.php', true);
上面代码向指定的服务器网址,发出GET请求。
然后,AJAX指定回调函数,监听通信状态(readyState属性)的变化。
ajax.onreadystatechange = handleStateChange;
一旦拿到服务器返回的数据,AJAX不会刷新整个网页,而是只更新相关部分,从而不打断用户正在做的事情。
open方法的第三个参数是一个布尔值,表示是否为异步请求。如果设为false,就表示这个请求是同步的
下面来看一个实例:
myButton.addEventListener('click', (e)=>{
let request = new XMLHttpRequest()
request.open('get', '/xxx') // 配置request
request.send()
request.onreadystatechange = ()=>{
if(request.readyState === 4){
console.log('请求响应都完毕了')
console.log(request.status)
if(request.status >= 200 && request.status < 300){
console.log('说明请求成功')
console.log(typeof request.responseText)
console.log(request.responseText)
let string = request.responseText
// 把符合 JSON 语法的字符串
// 转换成 JS 对应的值
let object = window.JSON.parse(string)
// JSON.parse 是浏览器提供的
console.log(typeof object)
console.log(object)
console.log('object.note')
console.log(object.note)
}else if(request.status >= 400){
console.log('说明请求失败')
}
}
}
})
后台代码
if(path==='/xxx'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/json;charset=utf-8')
response.write(`
{
"note":{
"to": "小谷",
"from": "书研",
"heading": "打招呼",
"content": "hi"
}
}
`)
response.end()
}
同源策略
所谓”同源”指的是”三个相同”:
- 协议相同
- 域名相同
- 端口相同
举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下。
http://www.example.com/dir2/other.html:同源
http://example.com/dir/other.html:不同源(域名不同)
http://v2.www.example.com/dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie
往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。由此可见,”同源政策”是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。
AJAX跨域
CORS 可以告诉浏览器,我俩一家的,别阻止他
突破同源策略 === 跨域
Cross-Origin Resource Sharing
在后台代码上加上这一句即可实现
response.setHeader('Access-Control-Allow-Origin', 'http://sy.com:8001')
记得要提前新开个端口