高级课程/Ajax

用 form 可以发请求,但是会刷新页面或新开页面
用 a 可以发 get 请求,但是也会刷新页面或新开页面
用 img 可以发 get 请求,但是只能以图片的形式展示
用 link 可以发 get 请求,但是只能以 CSS、favicon 的形式展示
用 script 可以发 get 请求,但是只能以脚本的形式运行

有没有什么方式可以实现?
//get、post、put、delete 请求都行
//想以什么形式展示就以什么形式展示
因为这样的需求,AJAX出现了~~

微软的突破

IE 5 率先在 JS 中引入 ActiveX 对象(API),使得 JS 可以直接发起 HTTP 请求。
随后 Mozilla、 Safari、 Opera 也跟进(抄袭)了,取名 XMLHttpRequest,并被纳入 W3C 规范


AJAX

AJAX:异步的 JavaScript 和 XML
使用 XMLHttpRequest 发请求
服务器返回 XML 格式的字符串
JS 解析 XML,并更新局部页面

如何使用 XMLHttpRequest

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('说明请求失败') 
  }

}

}
})


  • 有趣见闻
    当年ie6打遍天下无敌手,占了市场90%的市场份额,然后膨胀,微软做了一个愚蠢的决定,把之前浏览器团队,拆分了,里面的高手都被分散到别的部分,然后chorme异军突起,现在微软追悔莫及了~//
  • 这个功能出现一年之后不久,Gmail被开发出来了,那时候惊为天人,因为当年人都是用PC软件来收发邮件的,而Gmail是网页应用,突破通讯限制的就是AJAX技术,那时候起,人们才发现原来前端可以做很多事情,甚至说是这个技术的出现,衍生出前端这个岗位

  • 对于服务器来说,返回的第四部分永远是字符串,因为这样可以解决任何需求,为什么这样说? 比如说,JavaScript语法,是一种规则,是思想的产物,具体实现是依靠浏览器这个运行环境,好比说:古代一个大臣,满腹经纶,饱读诗书有经天纬地之才,你给皇上上奏了一套治国方略,关于经济政治的优秀建议,但是皇帝不执行,你的上奏奏表就一无是处.
  • 计算机语言的语法都是思想,得依靠具体的运行环境根据语法来解释你的代码,所以后台服务器和浏览器交互的时候,只要标明返回的字符有utf-8编码来解释就不会乱码,然后给定content-type 来告诉浏览器用什么语言的语法来解释这些字符串,最后返回一堆字符串让浏览器解释执行.//所以说:服务器返回的都是字符串~
  • 这里有个小细节,http都是绝对路径别写'.'

同源策略

  • 用过jsonp和ajax的人就会产生疑惑?/ 为什么form表单提交没有跨域问题,而ajax有跨域问题呢?
    //如果你不是baidu.com 页面里的JavaScript,你就不能向baidu.com域名发起AJcX请求这就是同源策略
    //什么时候才会被允许呢?//只有域名一模一样才允许,发ajax请求
    只有 协议+端口+域名 一模一样才允许发 AJAX 请求

一模一样一模一样一模一样一模一样一模一样一模一样一模一样一模一样

  1. http://baidu.com 可以向 http://www.baidu.com 发 AJAX 请求吗 no
  2. http://baidu.com:80 可以向 http://baidu.com:81 发 AJAX 请求吗 no

浏览器必须保证
只有 协议+端口+域名 一模一样才允许发 AJAX 请求
CORS 可以告诉浏览器,我俩一家的,别阻止他

突破同源策略 === 跨域

为什么不允许百度公司的网站访问百度公司的网站呢?

//因为有的公司,有可能把www开头的网站卖给别人,公司不想冒险这样做

同源策略根本原因

  • 因为原页面用form提交到另一个域名之后,原页面的脚本无法获取新页面的内容.也就意味着不能窃取数据,所以浏览器认为这是安全的,因为form表单会刷新啊,这个标签就是这样子的功能
  • 用ajax是可以读取响应内容的,因此浏览器不能允许你这样做,也就是说,你在一个页面上用ajax发请求,是可以读取该页面所在的服务器内部数据的(现在安全人员已经做到请求,能发出去,但是拿不到响应,也就是不让你ajax拿到服务器数据)
  • 本质是什么?

所以这个浏览器的同源策略,本质就是,一个域名的JavaScript代码.在未经允许的情况下,不得读取另一个域名内容,但是浏览器并不阻止你向另外一个域名发送请求.

  • 本人这里有个疑惑,ajax不也是发送那些请求吗?ajax发送的请求和那些基本请求有什么区别?为什么那些普通的,比如post能发,而ajax不能?ajax那么强大,为什么不禁止它?
    // 举个例子:
    假设用户在访问银行网站,并且没有登出。然后他又去了任意的其他网站,刚好这个网站有恶意的js代码,在后台请求银行网站的信息(注意这里前提是你没有登出之前的银行页面,也就是说当遇到恶意JavaScript代码,他的src写的是你登录的银行网址,就等于你用登录状态打开了银行页面,页面上的信息都能发回给恶意JavaScript代码所在的页面上)。因为用户目前仍然是银行站点的登陆状态,那么恶意代码就可以在银行站点做任意事情。例如,获取你的最近交易记录,创建一个新的交易等等。因为浏览器可以发送接收银行站点的session cookies,在银行站点域上。访问恶意站点的用户希望他访问的站点没有权限访问银行站点的cookie。当然确实是这样的,js不能直接获取银行站点的session cookie,但是他仍然可以向银行站点发送接收附带银行站点session cookie的请求,本质上就像一个正常用户访问银行站点一样。关于发送的新交易,甚至银行站点的CSRF(跨站请求伪造)防护都无能无力,因为脚本可以轻易的实现正常用户一样的行为。所以如果你需要session或者需要登陆时,所有网站都面临这个问题。如果上例中的银行站点只提供公开数据,你就不能触发任意东西,这样的就不会有危险了,这些就是同源策略防护的。当然,如果两个站点是同一个组织的或者彼此互相信任,那么就没有这种危险了。

https://www.jianshu.com/p/beb059c43a8b

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师...
    大大头大阅读 7,667评论 1 72
  • 1 今天大哥与在西安的父亲见面了,晚上与大哥和父亲、母亲通了电话,问候了平安,内心踏实了很多!亲人的关爱是最大的支...
    LiHongxi阅读 156评论 0 0
  • 我本身就是个平常人,没必要说些“优美佳句”。
    林仕希阅读 131评论 0 0
  • 打开车门,把后座一堆东西推倒一边,我先钻进来。婆婆也想做进来,我就说,还是坐前面吧,后面位置本来就不大。然后童梦泽...
    WEI_曹蕾阅读 265评论 0 1