|
創(chuàng)建交互式web 頁(yè)面時(shí)最大的挑戰(zhàn)之一是維持用戶(hù)的狀態(tài),一個(gè)站點(diǎn)也許想記住你是誰(shuí)、在n頁(yè)之前你點(diǎn)擊了什么、在這最后一次做了些什么、現(xiàn)在馬上要向你顯示什么。實(shí)現(xiàn)這些功能的途徑有許多,如查詢(xún)字符串、提交表單或cookies,最強(qiáng)大的一種是ASP的Session 對(duì)象。 原文出處:http://www.asptoday.com/articles/20000118.htm當(dāng)用戶(hù)第一次到達(dá)某站點(diǎn),他/她被給予一個(gè)HTTP cookie格式的SessionID (是一個(gè)只讀屬性, 為每個(gè)用戶(hù)返回session 識(shí)別號(hào))。然后服務(wù)器可以在session 集合中跟蹤一整群的變量,通過(guò) 與用戶(hù)的session cookie相匹配來(lái)保持每個(gè)用戶(hù)有一個(gè)特定變量。只要用戶(hù)在服務(wù)器上保持活躍, session 變量就維持它的狀態(tài)。一個(gè)session 變量的默認(rèn)有效時(shí)間是20分鐘,或者是每當(dāng)用戶(hù)關(guān)閉 瀏覽器,這時(shí)無(wú)論session_OnEnd 部分是什么內(nèi)容,global.asa 文件都運(yùn)行。
以上陳述的關(guān)鍵是“在服務(wù)器上保持激活狀態(tài)”。每個(gè)session變量都在網(wǎng)絡(luò)服務(wù)器上設(shè)置,并保持在 本地內(nèi)存中。所以,如果你在一個(gè)web 范圍內(nèi)使用負(fù)載平衡怎么辦?(負(fù)載平衡的介紹請(qǐng)見(jiàn) msdn 文章 ‘ASP and Web Session Management’)。對(duì)真正的負(fù)載平衡來(lái)說(shuō),每當(dāng)居住于服務(wù)器 上的用戶(hù)點(diǎn)擊一個(gè)連接時(shí),它就改變服務(wù)器的狀態(tài),每當(dāng)瀏覽一個(gè)新頁(yè)面時(shí)都潛在地丟失他們的 session 信息。
如果你發(fā)現(xiàn)自己是在這樣的環(huán)境下編寫(xiě)代碼--或者你懷疑你的站點(diǎn)最終是負(fù)載平衡的--你有4種方法 來(lái)解決這個(gè)問(wèn)題。
○ 完全不使用session 。 ○ 使用臨時(shí)cookies 。 ○ 購(gòu)買(mǎi)第三方組件來(lái)處理session 管理。 ○ 僅對(duì)web 范圍內(nèi)的第一次點(diǎn)擊進(jìn)行負(fù)載平衡。
本文將討論這四種選擇,并解釋它們分別在何時(shí)何地最適用。
根本不使用sessions
顯然,饒過(guò)sessions 管理這個(gè)問(wèn)題的一個(gè)途徑就是根本不使用sessions 變量。但是你仍然受困于 狀態(tài)保持的問(wèn)題。你可以使用最簡(jiǎn)單的方法跟蹤用戶(hù),而不用寫(xiě)客戶(hù)機(jī)。
一種不安全的方法是使用瀏覽器查詢(xún)字符串,或用隱藏值進(jìn)行表單置入,以使用戶(hù)保持活躍狀態(tài)。 這將允許你給他們一個(gè)用戶(hù)id,并將變量存儲(chǔ)在一個(gè)所有的web服務(wù)器都能到達(dá)的地方。比如說(shuō) 我保持了變量 ShipToZipCode、 TypeOfCustomer和 CustomerEmail?梢赃@樣寫(xiě):
< form action="/nextpage.asp" method="post" > Item Number: < input type=text name="ItemNumber" >< br > Quantity: < input type=text name="Quantity">< br > Unit Cost:< input type=text name="UnitCost">< br > < input type=hidden value="ABXXXKJR8JSDFI12KJIL2H75CX45X2" name="sessionid" > < input type=submit value="post form" > < /form >
然后,在 nextpage.asp上, 可以做以下工作:
Set conn=Server.CreateObject(ADODB.Connection) Set SessionRS = conn.execute("Select ShipToZipCode, TypeOfCustomer, _CustomerEmail from TblSession where SessionID =" & request.form("sessionid")) ShipToZipCode = SesssionRs("ShipToZipCode") TypeOfCustomer = SesssionRs("TypeOfCustomer") CustomerEmail = SesssionRs("CustomerEmail")
這樣通過(guò)將所有的"session" 信息存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以使這三個(gè)變量在每一頁(yè)上都保持活躍。確保 用戶(hù)id的值很難猜到,這很重要。當(dāng)訪問(wèn)第一頁(yè)時(shí),將分配給用戶(hù)的sessionID 存儲(chǔ)為用戶(hù)名。當(dāng)用戶(hù) 離開(kāi)這一頁(yè)時(shí)可以考慮清除這個(gè)數(shù)據(jù),有效地重新生成ASP session 對(duì)象。這可以手工完成,或者用 一個(gè)限時(shí)程序?qū)?shù)周以上的記錄刪除。
使用臨時(shí)Cookies 對(duì)于特別的非敏感數(shù)據(jù),直接向客戶(hù)機(jī)中寫(xiě)入信息是有意義的。比如說(shuō),如果我的站點(diǎn)只使用了一個(gè) 變量來(lái)跟蹤用戶(hù)的ZIP 碼來(lái)得到用戶(hù)在當(dāng)?shù)氐慕煌ㄓ涗洠敲匆訦TTP cookie的形式將用戶(hù)的ZIP碼 寫(xiě)入他們的機(jī)器應(yīng)該不會(huì)產(chǎn)生什么危害。因?yàn)槟憧梢詫ookie寫(xiě)成瀏覽器關(guān)閉時(shí)失效,就可以使它們 模仿一個(gè)session 變量的功能,也可以使他們是持久的,好在用戶(hù)下一次訪問(wèn)時(shí)記住他。
用Request 對(duì)象Cookie 的值可以為服務(wù)器所用。請(qǐng)求Cookie 的值,然后將值帶進(jìn)來(lái)。所以在我們上面 的例子中,可以這樣做:
ShipToZipCode = Request.Cookies("SessionCookie")("ShipToZipCode") TypeOfCustomer = Request.Cookies("SessionCookie")("TypeOfCustomer") CustomerEmail = Request.Cookies("SessionCookie")("CustomerEmail")
你不得不把這些放置在每個(gè)頁(yè)面的頂部,但是如果用戶(hù)把三個(gè)cookies 都設(shè)置了,那么每一頁(yè)都可以 存取和使用這些用戶(hù)特定的變量。你還可以在一個(gè)cookie中設(shè)置三個(gè)變量,請(qǐng)看Ken Baumbach的文章 Cookie Basics with ASP,里面有設(shè)置變量的更多信息。
如果你認(rèn)為用戶(hù)可能在瀏覽器上使Cookie 無(wú)效,這種方法就不適用。但是越來(lái)越多的站點(diǎn)要求使用 cookies,web 用戶(hù)也越來(lái)越熟練了。有可能相對(duì)很少的用戶(hù)會(huì)使cookies無(wú)效,但是這要在執(zhí)行 這一方法之前進(jìn)行考慮。 雖然上面的方法肯定能奏效,但是它們削弱了ASP的功能,因?yàn)樗拗屏似渲幸粋(gè)關(guān)鍵組件--Session 對(duì)象的使用。要避免由負(fù)載平衡導(dǎo)致的這種限制,繼續(xù)使用sessions的一種方法是購(gòu)買(mǎi)一個(gè)第三方 組件,可以比IIS更好地處理Session。
在本文中,我不想比較各種第三方組件的優(yōu)缺點(diǎn)。但是我聽(tīng)說(shuō)有一個(gè)組件工作得挺好,是SoftArtisans 提供的,叫做 SA-Session Pro。它使用NT文件系統(tǒng)存儲(chǔ)用戶(hù)的信息,整個(gè)網(wǎng)絡(luò)范圍內(nèi)的服務(wù)器都可以 使用。其它第三方組件創(chuàng)建“session 引擎”把網(wǎng)絡(luò)服務(wù)器和session 管理器分離。這樣,每次用戶(hù) 都可以被重定向到相同的session 引擎,同時(shí)也對(duì)服務(wù)器本身的點(diǎn)擊進(jìn)行負(fù)載平衡。
另一個(gè)可選擇的第三方組件是Microsoft的成員服務(wù)器。它與Microsoft的站點(diǎn)服務(wù)器,它允許一個(gè) 站點(diǎn)處理狀態(tài)維護(hù)以外的問(wèn)題。在Bill Pitzer的文章‘Moving your "Anonymous" visitors to registered status using Site Server and Membership Directory Authentication’中有更多的 信息。
由于ASP已經(jīng)越來(lái)越成為企業(yè)級(jí)網(wǎng)絡(luò)應(yīng)用程序的選擇,而負(fù)載平衡也成為這些應(yīng)用程序成功的最大威脅, 在市場(chǎng)上會(huì)出現(xiàn)越來(lái)越多的第三方組件。ASP本身就是服務(wù)器對(duì)象或ActiveX組件,就是可以處理這些 插件的。
|
溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!