AJax技术

我在同步 ajax 的 cookie 上栽了个无语的跟头(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-25 17:00 我要评论( )

下面使用 node 实现这个可写 cookie 的服务。 【serve.js】 var express = require("express");var http = require("http");var fs = require("fs");var app = express();var router = express.Router();router.pos

下面使用 node 实现这个可写 cookie 的服务。
【serve.js】

var express = require("express"); var http = require("http"); var fs = require("fs"); var app = express(); var router = express.Router(); router.post('/api', function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); res.header("Set-Cookie", ["target=ccccccc|" + new Date()]); res.end('ok'); }); router.get('/test1', function (req, res, next) { fs.readFile("./nej.html", function (err, data) { res.end(data); }); }); router.get('/test2', function (req, res, next) { fs.readFile("./jquery.html", function (err, data) { res.end(data); }); }); router.get('/test3', function (req, res, next) { fs.readFile("./js.html", function (err, data) { res.end(data); }); }); app.use('http://www.jishux.com/', router); http.createServer(app).listen(3000);

好了,万事大吉,run 一把

$ node serve.js 操作

我们一次执行两个操作,

结果

【nej.html】

【js.html】

  • 纯净环境加载,未读取到目标 cookie
  • 刷新加载,未读取到目标 cookie
  • 咦?结果不一样!使用 nej 的第二次加载读取到了第一次 cookie。其他的两次均为获取到。

    原因

    nej 依赖框架的加载是异步的,当同步请求发起时,dom 已经加载完毕,回调相应时,document.cookie已经呈ready状态,可读可写。但本次请求依然获取不到本次返回的 cookie。

    而其他两种加载的机制阻塞了 dom 的加载,导致同步请求发起时,dom 尚未加载完成,回调相应时,document.cookie依然不可写。

    单因子对照

    我们将以上上个 html 文件的逻辑做下修改。
    将同步请求的发起推迟到 document 点击时在发起。
    如下

    $('document').click(function () { // TODO 发起同步请求 });

    依然是上面的执行步骤,来看看此次的结果

    结果

    【nej.html】

    【js.html】

  • 纯净环境加载,未读取到目标 cookie
  • 刷新加载,读取到上一次请求返回的 cookie
  • 结果和预期一样,本次请求无法获取本期返回的目标 cookie,请求回调执行后,目标cookie才会更新到document.cookie上。

    特例

    在执行以上操作是,发现,【jquery.html】的执行结果时不时会有两种结果

  • 纯净环境加载,未读取到目标 cookie
  • 刷新加载,读取到上一次请求返回的 cookie
    另外一种几率较小,但也会出现
  • 解决方案

    只有问题没有方案的都是在耍流氓!

    方案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设计者、程序员和项目经理阅读,也可作为相关专业学习用书和培训学校教材。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • HTML / CSS技巧 – 可滚动的 tbody(漂亮表格)

      HTML / CSS技巧 – 可滚动的 tbody(漂亮表格)

      2017-10-13 12:05

    • 【htmlunit开发技巧】

      【htmlunit开发技巧】

      2017-10-06 11:01

    • CDN后用Ajax动态提交、显示文章阅读量,cookies避免重复刷新

      CDN后用Ajax动态提交、显示文章阅读量,cookies避免重复刷新

      2017-09-04 17:04

    • jquery ajax 返回执行js 脚本

      jquery ajax 返回执行js 脚本

      2017-08-27 14:04

    网友点评