下面使用 node 实现这个可写 cookie 的服务。
【serve.js】
好了,万事大吉,run 一把
$ node serve.js 操作我们一次执行两个操作,
结果【nej.html】
【js.html】
咦?结果不一样!使用 nej 的第二次加载读取到了第一次 cookie。其他的两次均为获取到。
原因nej 依赖框架的加载是异步的,当同步请求发起时,dom 已经加载完毕,回调相应时,document.cookie已经呈ready状态,可读可写。但本次请求依然获取不到本次返回的 cookie。
而其他两种加载的机制阻塞了 dom 的加载,导致同步请求发起时,dom 尚未加载完成,回调相应时,document.cookie依然不可写。
单因子对照我们将以上上个 html 文件的逻辑做下修改。
将同步请求的发起推迟到 document 点击时在发起。
如下
依然是上面的执行步骤,来看看此次的结果
结果【nej.html】
【js.html】
结果和预期一样,本次请求无法获取本期返回的目标 cookie,请求回调执行后,目标cookie才会更新到document.cookie上。
特例在执行以上操作是,发现,【jquery.html】的执行结果时不时会有两种结果
另外一种几率较小,但也会出现
只有问题没有方案的都是在耍流氓!
方案1 - 明修栈道暗度陈仓将回调方法中的 cookie 获取方法转化为异步操作。
_$ajax({ url: '/api', async: false, type: 'POST', success: function (result) { setTimeout(function(){ // do something 在此处获取 cookie 操作是安全的 },0) } }); 方案2 - 不抵抗政策没有把握的方案,我们是要斟酌着实施的。
如果你不能100%却被操作的安全性,那并不建议你强行使用 ajax 的同步操作,很多机制并不会像我们自以为是的那样理所应当。
友情链接善读书可以医愚
给大家推荐一本好书
《JavaScript框架设计(第2版)》
作者: 司徒正美
此书全面讲解了JavaScript框架设计及相关的知识,主要内容包括种子模块、语言模块、浏览器嗅探与特征侦测、类工厂、选择器引擎、节点模块、数据缓存模块、样式模块、属性模块、PC端和移动端的事件系统、jQuery的事件系统、异步模型、数据交互模块、动画引擎、MVVM、前端模板(静态模板)、MVVM的动态模板、性能墙与复杂墙、组件、jQuery时代的组件方案、avalon2的组件方案、react的组件方案等。
本书适合前端设计人员、JavaScript开发者、移动UI设计者、程序员和项目经理阅读,也可作为相关专业学习用书和培训学校教材。