披著羊皮的大野狼 Session
类别: ASP教程
??咿稍微大型一?c ASP 的人都知道,Session 呃??物件真是好用,它可以用?碛???使用者私有的儋料???担?既安全又方便。但是你真的知道 Session 的咦髟?理?幔炕蛟S了解以後,你就再也不太敢使用呃??令人又?塾趾薜奈锛?。腠然弈而替代之的方法稍嫌麻??,但在樘期考量之下,也就不得不呃?N做了。
首先?碇v嘱 Session 的好??,它可以用?碛???用?舳怂接械馁Y料???担??K且在?r殓?????炔???消失。呃真的是很重要的功能,尤其是有???T的系靳必??要用到的。像是???T的登入?ぬ?、?r殓、???B以及杂杂多多??????的即?r儋料?z如??物系靳????使用者的??物焕?鹊纳唐珐{,呃些儋???凫陡魇褂谜咚饺怂?需要,通常檫办者都是使用 Session ??????理。
然而,在 ASP 中的 Session 是使用 Cookies 所??成,伺服器?⑺?有的 Session ?扔???的儋料,以 Cookies 的方式?髦劣??舻??g盂器。通常一般?g盂器???⑦@些 Cookies 存起?恚?每??使用者?c啉呗劫,再次陪伺服器做呗???r,?g盂器就??把呃些 Cookies ?骰? Server 供做??理。呃即是 Session 的咦髟?理,??儋料量大一?c?r,由於必???鞒鋈ビ质栈??恚?不但吃??路铎??,效能相??降低,因?? Server 必??花偻更多的儋源在做呗????理和重新配置????篦等初始?幼鳌,F在你可能??想『我必??用呃功能,只好?奚??c了』,不咿本文嘱 Session 一方面是教?Т蠹疑儆茫涣硪环矫娈?然是有替代揠法,撅接著上?龅模?就是同?? Global.asa ?鹊? Application 物件。
Application 也是??????理???r儋料的好手,各方面的能力和用法都和 Session 一?樱?只不咿相蒉之下,它所????的儋料是?凫豆?用的,也就是任何使用者都可以共用的???悼臻g。Application 不像 Session ,不是?①Y料?鹘o使用者,等下一次呗??再坐取回?恚?它是直接????在 Server 上的????篦,相?χ?下效能上快上 Session 杂多。
由於 Application 物件是公用的,首先必??做的,就是要把一?K公用的?^域????斤各??使用者,??每??用???碛凶约旱??^域可以????儋料,以哌到模?M Session 的目的。?F在有?煞N做法:一、在 Server ?????r事先初始化建立及分配使用者????篦空殓,通常呃肺做法腠然一 Server 檫?C就先?琢嗽S多儋源,但也省去了以後每??使用者呗??就必??做一次分配的麻??。但有??限制,使用呃肺方法必??限制最大人?担?由於是一???泳统跏蓟?,我??只能盍估建立某?盗康挠???篦空殓,所以呃肺方法通常用於聊天室呃肺小型的程式上。二、呃肺方法??於大型??用程式?碚f????算蒉恰??的,?裼????B的分配法,??使用者第一次呗??到 Server 上才檫始分配儋源斤此用?簟_@?煞N模?M Session 的方案,目的都是?p蒺 Session 儋源的消耗,但??竟??是?o法完全替代,我????是需要使用到一?c?c Session,至少?? Server 已??能?p蒺不少????了。
■第一方案
首先我??檫始第一??方案的??作,由於是?????r初始化 Application,我????然要?? Global.asa中著手:
已??完成初始化了,但如何使用呢?我??只要在使用者登入的地方,把原本使用 Session ?Υ娴馁Y料,如?ぬ?、登入?r殓,改成我??建立好的 Application 物件中就可以了:
'?ふ椅幢皇褂玫目臻gFor i = 1 To Application("ClientMax") If Application("User_Status_" & i) = 0 Then '使用者???r???? Session("Index") = i '骈定 Application Application.Lock '韵成已使用的???B Application("User_Status_" & i) = 1 '放入???蒂Y料 Application("User_Account_" & i) = Account Application("User_Logtime_" & i) = Now() '解除骈定 Application.Unlock Exit For End IfNext
要取得使用者的相晷???蒂Y料?t就像下面的做法:
Response.Write(Application("User_Account_" & Session("Index"))
你可能??办?F,不是真不要使用 Session ?幔磕??槭颤N上面的原始瘁中??有 Session 的存在?前面也真咿,呃替代方案?K不能完全代替掉 Session,?g盂器?K不是一直和 Server ??於呗?????B的,坐取完??面就?嗑?,那我??要怎?N知道下次呗??的??是同一??人呢?呃?r候就必??要靠 Session,我??斤使用者一酵即?r的????,此????就是使用者於 Application 上???悼臻g的??瘁,你可以想像成泫行中有很多的保胝箱,你?碛幸恢ц?匙,而??匙上有????,??匙上的????可以??行?T?ьI你去你自己的保胝箱。此方法尚??有改咄之??,但?π⌒偷???用程式已??是很?蛴昧恕?
■第二方案
晷於上一方案,你可能也想到,我??自??的????使用了 Session ?碛???,嘱到????,Session 物件有提供一??『 SessionID 』方法。?]邋,不管我??要不要使用,Server 都??自???兔???用?艟?列??瘁,且此??瘁不??重妖,至於呃??瘁就是用 Session.SessionID 取得。呃??列??瘁是 Session 一定??做的?幼鳎?我??就可利用它代替我??自己??的????程式,亦又省了一道功夫,甚至有更大的?U充性。但基本上,上面的第一??方案??是有它的用途在,像是??限制人?档牧奶焓业鹊刃???用程式,接下?淼牡诙?替代方案,就是????蒉大型的系靳了。
每秒上站人?颠_?蛋??登?甚至上孺人的咀站,使用之前的方案,必定是行不通的。假韵你?⑸舷奕??翟O 10000 ,Server 一???泳????湍闱谐鲆蝗f???^域???浣o一孺??使用者,假若一???^域中有 5 ?????担?一???????? 32 位元酵(Byte),10000 ??就?琢? 320000 K(320MB) 以上,Server 一???泳腿?了那?N多的垃圾到????篦,效能?荼剡??]上???鼍徒档筒簧伲欢?且?e看呃些?底趾苌伲?以?樽约旱? 512 MB ???蛴茫?上面的?底质羌僭O一??最低?底郑?加上 Server 在配置????篦?r??铪外使用到多少儋源不得而知,所以只??更多不??更低。因此解?Q揠法只有???B配置使用者???悼臻g,??有使用者陪 Server 呗???r才切一?K?^域出?恚?如此便不??要事先就配置好??大????篦。
第二方案做起?硎潜容^???危???把第一方案的?|西全部?G掉,我??不需要?拥? Global.asa,只需要改使用者登入的地方和其他有用到的地方:
'骈定 ApplicationApplication.Lock '放入???蒂Y料Application("User_Account_" & Session.SessionID) = AccountApplication("User_Logtime_" & Session.SessionID) = Now() '解除骈定Application.Unlock
要取得使用者的相晷???蒂Y料?t就像下面的做法:
Response.Write(Application("User_Account_" & Session.SessionID))
以往看很多??,都??著 Session 吃儋源吃的很?矗???量不要用,可是必??用的?r候??是得用,??彦又都?]教蒉妥??的解?Q揠法。?F在??你懂了如何替代 Session,好好去利用吧!或杂老是困?_的效能??铨能因此改善不少!
首先?碇v嘱 Session 的好??,它可以用?碛???用?舳怂接械馁Y料???担??K且在?r殓?????炔???消失。呃真的是很重要的功能,尤其是有???T的系靳必??要用到的。像是???T的登入?ぬ?、?r殓、???B以及杂杂多多??????的即?r儋料?z如??物系靳????使用者的??物焕?鹊纳唐珐{,呃些儋???凫陡魇褂谜咚饺怂?需要,通常檫办者都是使用 Session ??????理。
然而,在 ASP 中的 Session 是使用 Cookies 所??成,伺服器?⑺?有的 Session ?扔???的儋料,以 Cookies 的方式?髦劣??舻??g盂器。通常一般?g盂器???⑦@些 Cookies 存起?恚?每??使用者?c啉呗劫,再次陪伺服器做呗???r,?g盂器就??把呃些 Cookies ?骰? Server 供做??理。呃即是 Session 的咦髟?理,??儋料量大一?c?r,由於必???鞒鋈ビ质栈??恚?不但吃??路铎??,效能相??降低,因?? Server 必??花偻更多的儋源在做呗????理和重新配置????篦等初始?幼鳌,F在你可能??想『我必??用呃功能,只好?奚??c了』,不咿本文嘱 Session 一方面是教?Т蠹疑儆茫涣硪环矫娈?然是有替代揠法,撅接著上?龅模?就是同?? Global.asa ?鹊? Application 物件。
Application 也是??????理???r儋料的好手,各方面的能力和用法都和 Session 一?樱?只不咿相蒉之下,它所????的儋料是?凫豆?用的,也就是任何使用者都可以共用的???悼臻g。Application 不像 Session ,不是?①Y料?鹘o使用者,等下一次呗??再坐取回?恚?它是直接????在 Server 上的????篦,相?χ?下效能上快上 Session 杂多。
由於 Application 物件是公用的,首先必??做的,就是要把一?K公用的?^域????斤各??使用者,??每??用???碛凶约旱??^域可以????儋料,以哌到模?M Session 的目的。?F在有?煞N做法:一、在 Server ?????r事先初始化建立及分配使用者????篦空殓,通常呃肺做法腠然一 Server 檫?C就先?琢嗽S多儋源,但也省去了以後每??使用者呗??就必??做一次分配的麻??。但有??限制,使用呃肺方法必??限制最大人?担?由於是一???泳统跏蓟?,我??只能盍估建立某?盗康挠???篦空殓,所以呃肺方法通常用於聊天室呃肺小型的程式上。二、呃肺方法??於大型??用程式?碚f????算蒉恰??的,?裼????B的分配法,??使用者第一次呗??到 Server 上才檫始分配儋源斤此用?簟_@?煞N模?M Session 的方案,目的都是?p蒺 Session 儋源的消耗,但??竟??是?o法完全替代,我????是需要使用到一?c?c Session,至少?? Server 已??能?p蒺不少????了。
■第一方案
首先我??檫始第一??方案的??作,由於是?????r初始化 Application,我????然要?? Global.asa中著手:
已??完成初始化了,但如何使用呢?我??只要在使用者登入的地方,把原本使用 Session ?Υ娴馁Y料,如?ぬ?、登入?r殓,改成我??建立好的 Application 物件中就可以了:
'?ふ椅幢皇褂玫目臻gFor i = 1 To Application("ClientMax") If Application("User_Status_" & i) = 0 Then '使用者???r???? Session("Index") = i '骈定 Application Application.Lock '韵成已使用的???B Application("User_Status_" & i) = 1 '放入???蒂Y料 Application("User_Account_" & i) = Account Application("User_Logtime_" & i) = Now() '解除骈定 Application.Unlock Exit For End IfNext
要取得使用者的相晷???蒂Y料?t就像下面的做法:
Response.Write(Application("User_Account_" & Session("Index"))
你可能??办?F,不是真不要使用 Session ?幔磕??槭颤N上面的原始瘁中??有 Session 的存在?前面也真咿,呃替代方案?K不能完全代替掉 Session,?g盂器?K不是一直和 Server ??於呗?????B的,坐取完??面就?嗑?,那我??要怎?N知道下次呗??的??是同一??人呢?呃?r候就必??要靠 Session,我??斤使用者一酵即?r的????,此????就是使用者於 Application 上???悼臻g的??瘁,你可以想像成泫行中有很多的保胝箱,你?碛幸恢ц?匙,而??匙上有????,??匙上的????可以??行?T?ьI你去你自己的保胝箱。此方法尚??有改咄之??,但?π⌒偷???用程式已??是很?蛴昧恕?
■第二方案
晷於上一方案,你可能也想到,我??自??的????使用了 Session ?碛???,嘱到????,Session 物件有提供一??『 SessionID 』方法。?]邋,不管我??要不要使用,Server 都??自???兔???用?艟?列??瘁,且此??瘁不??重妖,至於呃??瘁就是用 Session.SessionID 取得。呃??列??瘁是 Session 一定??做的?幼鳎?我??就可利用它代替我??自己??的????程式,亦又省了一道功夫,甚至有更大的?U充性。但基本上,上面的第一??方案??是有它的用途在,像是??限制人?档牧奶焓业鹊刃???用程式,接下?淼牡诙?替代方案,就是????蒉大型的系靳了。
每秒上站人?颠_?蛋??登?甚至上孺人的咀站,使用之前的方案,必定是行不通的。假韵你?⑸舷奕??翟O 10000 ,Server 一???泳????湍闱谐鲆蝗f???^域???浣o一孺??使用者,假若一???^域中有 5 ?????担?一???????? 32 位元酵(Byte),10000 ??就?琢? 320000 K(320MB) 以上,Server 一???泳腿?了那?N多的垃圾到????篦,效能?荼剡??]上???鼍徒档筒簧伲欢?且?e看呃些?底趾苌伲?以?樽约旱? 512 MB ???蛴茫?上面的?底质羌僭O一??最低?底郑?加上 Server 在配置????篦?r??铪外使用到多少儋源不得而知,所以只??更多不??更低。因此解?Q揠法只有???B配置使用者???悼臻g,??有使用者陪 Server 呗???r才切一?K?^域出?恚?如此便不??要事先就配置好??大????篦。
第二方案做起?硎潜容^???危???把第一方案的?|西全部?G掉,我??不需要?拥? Global.asa,只需要改使用者登入的地方和其他有用到的地方:
'骈定 ApplicationApplication.Lock '放入???蒂Y料Application("User_Account_" & Session.SessionID) = AccountApplication("User_Logtime_" & Session.SessionID) = Now() '解除骈定Application.Unlock
要取得使用者的相晷???蒂Y料?t就像下面的做法:
Response.Write(Application("User_Account_" & Session.SessionID))
以往看很多??,都??著 Session 吃儋源吃的很?矗???量不要用,可是必??用的?r候??是得用,??彦又都?]教蒉妥??的解?Q揠法。?F在??你懂了如何替代 Session,好好去利用吧!或杂老是困?_的效能??铨能因此改善不少!
- 上一篇: 在ASP中怎?用Excel??表
- 下一篇: 两级联动的select XML版
-= 资 源 教 程 =-
文 章 搜 索