NetBox 2.7 使用手册

噩梦:从 Session 开始

ASP 的 Session 对象是一个充满了神奇和灵感的创意,她的出现,将程序员从直接使用 Cookie 存储用户私有信息的时代带到了安全快速方便的服务器存储时代。使用 Session,我们可以方便的存储针对用户的个人信息,而且无需考虑数据的丢弃问题,服务器会自动帮助你清除垃圾数据。于是 Session 几乎成为 asp 编程中最常用的对象:用户的登录状态,用户的名称,用户的个性设置,用户的好友列表,用户的购物小车,等等等等,一切与用户个人相关的数据无一例外的被首选存放在 Session 中,以避免每次重复的数据库操作。

原本是美妙的

Session 对象以内存为基础的索引机制,带来了她高速的操作性能,方便的使用方法,但是也带来了今后发展的问题,我们先来研究一下 Session 的运行机制。当一个新的用户第一次访问一个 asp 程序时,系统发现没有与其对应的会话存在,便创建一个新的会话,并将会话的标识字符串通过 Cookie 传送给客户浏览器,此 Cookie 一般是下面的内容(以 NetBox 为例):

Set-Cookie: OHJZVBWSIKIVAHIMHSMV=WKMLOETOSAUPJAFJWLOQSDNGRBXLXPGIPWBJYVTL; path=/

这个 Cookie 表明它是一个本站的临时 Cookie,就是说它只在浏览器运行时有效,一旦浏览器关闭,则此 Cookie 自动删除,不存放在硬盘中,并且此 Cookie 只会被传送到发送它的网站。同时我们发现无论是 Cookie 的名称还是内容都是毫无规律的一个字符串,其中名字是每个 Http 服务器的虚拟主机在创建的时候随机生成的,并且在整个运行过程中保持不变,以便接受自己发送出去的 Cookie,而 Cookie 的内容则是在服务器创建会话时随机生成的唯一标识,用于在浏览器和服务器之间维持会话使用。

当下次浏览器再访问此服务器的 asp 程序时,将自动将前面接受的这个 Cookie 返回送给服务器,服务器则根据这个 Cookie 的标识,在自己保存的会话中寻找到相应的会话,作为 Session 对象提供给 asp 程序使用。而 Session 中存储的数据,则是全部存放在服务器的内存中,以保证访问的方便快速。

很简单的原理,但是神奇而且美妙。

迁移:鱼与熊掌

鱼跟熊掌本来是没有关系的,贪心的人多了,便有了关系。 --我

在未来的某一天,当我们的贪心发展到了一定的阶段,而不得不将一部分功能拆分出来由独立的服务器提供支撑,此时的困惑便开始出现了:在一个服务器上面登录过的用户,到了另外一个服务器还需要再次登录吗?如果不需要登录,用户怎么才能从一个服务器上迁移到另外一个服务器呢?

答案是:不可以。

首先是 Cookie。从前面的原理我们知道,维持 Session 会话的 Cookie 是一个私有的临时 Cookie,只可能被传送会发送它的主机,而当由另外一个主机提供其他相关服务时,它是无法得到这个 Cookie 的。

其次是 Session 的内容。出于效率和易用性的原因,Session 中存放的数据是全部保存的服务器的内存中的,无论如何是不能指望能够从另外一个服务器中直接访问到这些数据的,不要相信那些告诉你能够做到这些的人,他们只会带来更大的性能噩梦,频繁的服务器间访问和同步会随着应用的发展和服务器数量的增加迅速增长,很快你会发现再增加服务器反而导致性能的下降。

鱼是什么?鱼是 Session,灵巧,美味,但是单薄无力。熊掌是什么呢?

分析:鱼的什么和熊掌的什么

为了能够迁移用户,我们必须放弃一些东西。我们可以分析一下存放在 Session 里面的数据性质:

一,用户的永久属性。比如用户名,用户 ID,用户级别,用户个性化信息,等等,这些信息都是用户的固定属性,本来是存储在数据库中的,这里把它们存放在 Session 中,纯粹是为了较少数据库访问次数,以提高性能。这部分数据的关键在于用户名或者是用户 ID,一旦拥有其中的一个数据,其他的数据全部是可以从数据库中重新获得。

二,用户临时属性。一般来说可能是应用的临时数据,比如最后发言时间,当前留言状态,等等应用相关的数据。由于应用的相关性,这类数据迁移的意义并不大,在跨服务器时由于进入了另外一个应用,这些数据完全可以放弃。

三,用户临时数据。有些应用可能会在浏览过程中产生一组数据,这些数据是在不同的页面不同的时间产生,在有些实现中可能选择先暂存在 Session 中,最后根据用户的选择提交或者放弃。购物小车就是这样一个典型的应用。然而由于此类数据的特殊性质,其实存放在 Session 并不能体现出其高效灵活的特性,对于此类数据,直接在数据库中存储数据反而比在 Session 中方便。

为了让用户完全透明,在跨服务器时毫无感觉,核心的问题其实就是数据的自由获取,用户可以在他希望的地方得到自己希望的数据,比如自己的用户信息,自己的购物小车。下面我将给出一个 NetBox 针对这个问题给出的解决方案,这个方案可以有限的移植到 iis 上面,但是无论时易用性和安全性都大大削弱,大家可以自己去尝试一下。


版权所有: 2003- 网络盒子