zoukankan      html  css  js  c++  java
  • AJAX处理Session

    每个做过web应用的开发人员一定都对 Session 不陌生,用户在进入应用到离开应用的这段时间,我们常常把用户特定的一些状态或全局变量保存在 Session 对象中,各种 Web 开发语言或平台都有自己的 Session 实现。关于Session,不用解释太多,需要复习一下的话,就看看国内原创的 Session详解。
    在传统的Web开发方式中,如何使用Session就是常常让开发人员加班的主要问题之一。AJAX 作为新兴的Web应用开发理念,风光无限之下,也面对着Session的难题。

    最先,Marc Wandschneider 发出了疑问:Troubles with Asynchronous Ajax Requests and PHP Sessions。他提供了一些简单的php代码例子来说明多个异步XMLHttpRequest同时访问操作Session对象的服务端脚本时,可能导致多线程应用的典型问题——竞态条件(Race Condition)。作者无奈的认为这是 one of those problems best solved by avoiding it 。

    Harry Fuecks 纠正了前文中的一些疑误,他在AJAX and Session “Race Conditions” 一文中强调:竞态条件不是PHP的问题,而是HTTP协议无状态的特性所致。并将问题深入到两种形式的Ajax应用对比—— HTML++ vs. Client/SOA —— 由客户段还是服务端来管理状态。目前大多数的Ajax应用是HTML++的形式,Session依然由服务端管理,而Client/SOA形式则可能由客户端来承担大部分Session状态管理的工作,但目前看来这样的方式离成熟应用还需要不少努力。

    《Ajax in Action》的作者(Eric)在很早也已经意识到了 Session 的问题,他给开发人员提出了一些Session注意事项。其中提到了两个问题:

    定时刷新的XMLHttpRequest导致Session永不过期,可能引发的安全隐患。
    Eric 的解决建议一来就是如果交互的数据与用户信息无关的话,可用XMLHttpRequest轮询不影响Session的文件类型。二来就是编写自己定义的Session监视机制。
    XMLHttpRequest 访问Session已过期的页面,对返回结果的不当处理。
    Eric 建议更加仔细的编写代码,同时应该提供一个机制让用户知道会话已过期的状态。
    为此Eric编写了一段程序 Ajax Session Management Timer 帮助解决以上的两个问题,设计思路就是用一个JS的计时器监视距Session过期剩余的时间,并提前用友好的方式提醒用户保存数据或者激发一个延续Session的操作。

    还没有评论 | 发表评论

    2006-03-08 星期三
    Prototype : $() 的变化
    从最新版本的Prototype里,我发现我用得最多的 $() 方法代码有了变化: function $() {
    var results = [], element;
    for (var i = 0; i < arguments.length; i++) {
      element = arguments;
      if (typeof element == 'string')
        element = document.getElementById(element);
      results.push(Element.extend(element));
    }
    return results.length < 2 ? results[0] : results;
    }对比一下从前的版本 function $() {
    var elements = new Array(); for (var i = 0; i < arguments.length; i++) {
      var element = arguments;
      if (typeof element == 'string')
        element = document.getElementById(element);   if (arguments.length == 1)
        return element;   elements.push(element);
    } return elements;
    }
    区别主要是

    只有一个 return 语句,程序看起来更清晰,避免了函数多出口可能带来的混乱。
    最重要的,Element.extend(element) 方法的引入。
    这个Element.extend 也是1.5.x 版本的改进,看看它的源码: if (!window.Element)
    var Element = new Object();Element.extend = function(element) {
    if (!element) return; if (!element._extended && element.tagName && element != window) {
      var methods = Element.Methods;
      for (property in methods) {
        var value = methods[property];
        if (typeof value == 'function')
        element[property] = value.bind(null, element);
      }
    } element._extended = true;
    return element;
    }Element.Methods = {
    visible: function(element) {
      return $(element).style.display != 'none';
    },
    //other method toggle/show/hide/remove/getHeight...... etc.
    }
    Element.Methods 就是原来从前版本定义的 Element 对象的静态方法,这些方法都需要传递一个DOM对象id或者DOM对象作为参数,比如如上代码中的 visible 方法需要传递一个element参数。而Element.extend(element)语句将这些方法都设置给了参数对象,同时又利用 bind 方法让参数对象调用这些方法的时候,巧妙的传递自身作为参数。

    也许没说明白,还是用代码说明吧!从Prototype1.5.x版本开始,你可以更方便的如下面代码一样操作DOM对象了:

    var ele = $("myelement");
    ele.hide(); //隐藏DOM对象对比从前的版本var ele = $("myelement");
    Element.hide(ele); //隐藏DOM对象
    这样的改变有什么益处呢? 我觉得一来是更面向对象了,二来就是便于将来IDE里的代码提示。

  • 相关阅读:
    Uva 10494 If We Were a Child Again
    01 words & sentences BYOD
    Uva 465 Overflow
    354E
    MySQL/mariadb从删库到跑路——备份
    MySQL/mariadb知识点——日志记录(2)二进制日志
    MySQL/mariadb知识点——日志记录(1)
    MySQL/mariadb知识点——函数
    MySQL/mariadb知识点——数据库变量
    MySQL/mariadb知识点——事务Transactions
  • 原文地址:https://www.cnblogs.com/luluping/p/1510067.html
Copyright © 2011-2022 走看看