当前位置: 首页 > 图文教程 > 网络编程 > ASP > 披著羊皮的大野狼 - Session

ASP
ASP正则表达式技巧
ASP Access实现网站计数器(访问量)
ASP新闻分页,将一篇过长的文章分页,生成静态页面
一些关于asp 购物车的想法
一个sql查询器,自动画表格填字段
ASP实现文件直接下载的代码
把网页中的(电话,qq等数字)生成图片的ASP程序
asp长文章用分页符来分页显示
Asp函数介紹(37个常用函数)
ASP中的面向对象类
分页实现方法的性能比较
asp ajax跨域提交数据
asp修改文件和文件夹的名字的代码
ASP 多关键词查询实例代码
asp被杀毒软件误删的解决方法
asp 多关键词搜索的简单实现方法
asp 根据IP地址自动判断转向分站的代码
asp dictionary对象的用法
ASP 千万级数据分页的存储过程
ASP隐藏真实文件的下载功能实现代码

ASP 中的 披著羊皮的大野狼 - Session


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 66 ::
收藏到网摘: n/a

写过稍微大型一点 ASP 的人都知道,Session 这个物件真是好用,它可以用来记录使用者私有的资料变数,既安全又方便。但是你真的知道 Session 的运作原理吗?或许了解以后,你就再也不太敢使用这个令人又爱又恨的物件。虽然转而替代之的方法稍嫌麻烦,但在长期考量之下,也就不得不这么做了。

  首先来讲讲 Session 的好处,它可以用来记录用户端私有的资料变数,并且在时间范围内不会消失。这真的是很重要的功能,尤其是有会员的系统必须要用到的。像是会员的登入帐号、时间、状态以及许许多多该记录的即时资料﹝如购物系统记录使用者的购物篮内的商品﹞,这些资讯属于各使用者私人所需要,通常开发者都是使用 Session 记录处理。

  然而,在 ASP 中的 Session 是使用 Cookies 所构成,伺服器将所有的 Session 内记录的资料,以 Cookies 的方式传至用户的浏览器。通常一般浏览器会将这些 Cookies 存起来,每当使用者点选连结,再次与伺服器做连线时,浏览器就会把这些 Cookies 传回 Server 供做处理。这即是 Session 的运作原理,当资料量大一点时,由于必须传出去又收回来,不但吃线路频宽,效能相对降低,因为 Server 必须花费更多的资源在做连线处理和重新配置记忆体等初始动作。现在你可能会想“我必须用这功能,只好牺牲点了”,不过本文讲 Session 一方面是教导大家少用;另一方面当然是有替代办法,紧接着上场的,就是同属 Global.asa 内的 Application 物件。

  Application 也是记录处理暂时资料的好手,各方面的能力和用法都和 Session 一样,只不过相较之下,它所记录的资料是属于公用的,也就是任何使用者都可以共用的变数空间。Application 不像 Session ,不是将资料传给使用者,等下一次连线再读取回来,它是直接记录在 Server 上的记忆体,相对之下效能上快上 Session 许多。

  由于 Application 物件是公用的,首先必须做的,就是要把一块公用的区域规划给各个使用者,让每个用户拥有自己的区域可以记录资料,以达到模拟 Session 的目的。现在有两种做法:一、在 Server 启动时事先初始化建立及分配使用者记忆体空间,通常这种做法虽然一 Server 开机就先占了许多资源,但也省去了以后每当使用者连线就必须做一次分配的麻烦。但有个限制,使用这种方法必须限制最大人数,由于是一启动就初始化,我们只能预估建立某数量的记忆体空间,所以这种方法通常用于聊天室这种小型的程式上。二、这种方法对于大型应用程式来说应该算较恰当的,采用动态的分配法,当使用者第一次连线到 Server 上才开始分配资源给此用户。这两种模拟 Session 的方案,目的都是减轻 Session 资源的消耗,但毕竟还是无法完全替代,我们还是需要使用到一点点 Session,至少对 Server 已经能减轻不少负担了。

■第一方案

  首先我们开始第一个方案的实作,由于是启动时初始化 Application,我们当然要从 Global.asa中着手:

<SCRIPT LANGUAGE="VBScript" RunAt="Server">'Global.asa'Server 启动时执行Sub Application_OnStart() Dim i '设定最大上限人数为 50 人 Application("ClientMax") = 50 '为这 50 人事先建立变数空间 For i = 1 To Application("ClientMax") '记录此笔变数空间是否遭已使用 Application("User_Status_" & i) = 0 '建立两笔变数空间:帐号、登入时间 Application("User_Account_" & i) = Empty Application("User_Logtime_" & i) = Empty NextEnd Sub</SCRIPT>


  已经完成初始化了,但如何使用呢?我们只要在使用者登入的地方,把原本使用 Session 储存的资料,如帐号、登入时间,改成我们建立好的 Application 物件中就可以了:

'寻找未被使用的空间For i = 1 To Application("ClientMax") If Application("User_Status_" & i) = 0 Then '使用者暂时编号 Session("Index") = i '锁定 Application Application.Lock '设成已使用的状态 Application("User_Status_" & i) = 1 '放入变数资料 Application("User_Account_" & i) = Account Application("User_Logtime_" & i) = Now() '解除锁定 Application.Unlock Exit For End IfNext


  要取得使用者的相关变数资料则就像下面的做法:

Response.Write(Application("User_Account_" & Session("Index"))

  你可能会发现,不是说不要使用 Session 吗?那为什么上面的原始码中还有 Session 的存在?前面也说过,这替代方案并不能完全代替掉 Session,浏览器并不是一直和 Server 处于连线状态的,读取完页面就断线,那我们要怎么知道下次连线的还是同一个人呢?这时候就必须要靠 Session,我们给使用者一组即时的编号,此编号就是使用者于 Application 上变数空间的号码,你可以想像成银行中有很多的保险箱,你拥有一支钥匙,而钥匙上有编号,钥匙上的编号可以让行员带领你去你自己的保险箱。此方法尚还有改进之处,但对小型的应用程式已经是很够用了。

■第二方案

  关于上一方案,