創建交互式web 頁面時最大的挑戰之一是維持用戶的狀態,一個站點也許想記住你是誰、在n頁之前你點擊了什么、在這最后一次做了些什么、現在馬上要向你顯示什么。實現這些功能的途徑有許多,如查詢字符串、提交表單或cookies,最強大的一種是ASP的Session 對象。 原文出處:http://www.asptoday.com/articles/20000118.htm當用戶第一次到達某站點,他/她被給予一個HTTP cookie格式的SessionID (是一個只讀屬性, 為每個用戶返回session 識別號)。然后服務器可以在session 集合中跟蹤一整群的變量,通過 與用戶的session cookie相匹配來保持每個用戶有一個特定變量。只要用戶在服務器上保持活躍, session 變量就維持它的狀態。一個session 變量的默認有效時間是20分鐘,或者是每當用戶關閉 瀏覽器,這時無論session_OnEnd 部分是什么內容,global.asa 文件都運行。
以上陳述的關鍵是“在服務器上保持激活狀態”。每個session變量都在網絡服務器上設置,并保持在 本地內存中。所以,如果你在一個web 范圍內使用負載平衡怎么辦?(負載平衡的介紹請見 msdn 文章 ‘ASP and Web Session Management’)。對真正的負載平衡來說,每當居住于服務器 上的用戶點擊一個連接時,它就改變服務器的狀態,每當瀏覽一個新頁面時都潛在地丟失他們的 session 信息。
如果你發現自己是在這樣的環境下編寫代碼--或者你懷疑你的站點最終是負載平衡的--你有4種方法 來解決這個問題。
○ 完全不使用session 。 ○ 使用臨時cookies 。 ○ 購買第三方組件來處理session 管理。 ○ 僅對web 范圍內的第一次點擊進行負載平衡。
本文將討論這四種選擇,并解釋它們分別在何時何地最適用。
根本不使用sessions
顯然,饒過sessions 管理這個問題的一個途徑就是根本不使用sessions 變量。但是你仍然受困于 狀態保持的問題。你可以使用最簡單的方法跟蹤用戶,而不用寫客戶機。
一種不安全的方法是使用瀏覽器查詢字符串,或用隱藏值進行表單置入,以使用戶保持活躍狀態。 這將允許你給他們一個用戶id,并將變量存儲在一個所有的web服務器都能到達的地方。比如說 我保持了變量 ShipToZipCode、 TypeOfCustomer和 CustomerEmail。可以這樣寫:
< 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")
這樣通過將所有的"session" 信息存儲在數據庫中,可以使這三個變量在每一頁上都保持活躍。確保 用戶id的值很難猜到,這很重要。當訪問第一頁時,將分配給用戶的sessionID 存儲為用戶名。當用戶 離開這一頁時可以考慮清除這個數據,有效地重新生成ASP session 對象。這可以手工完成,或者用 一個限時程序將數周以上的記錄刪除。
使用臨時Cookies 對于特別的非敏感數據,直接向客戶機中寫入信息是有意義的。比如說,如果我的站點只使用了一個 變量來跟蹤用戶的ZIP 碼來得到用戶在當地的交通記錄,那么以HTTP cookie的形式將用戶的ZIP碼 寫入他們的機器應該不會產生什么危害。因為你可以將cookie寫成瀏覽器關閉時失效,就可以使它們 模仿一個session 變量的功能,也可以使他們是持久的,好在用戶下一次訪問時記住他。
用Request 對象Cookie 的值可以為服務器所用。請求Cookie 的值,然后將值帶進來。所以在我們上面 的例子中,可以這樣做:
ShipToZipCode = Request.Cookies("SessionCookie")("ShipToZipCode") TypeOfCustomer = Request.Cookies("SessionCookie")("TypeOfCustomer") CustomerEmail = Request.Cookies("SessionCookie")("CustomerEmail")
你不得不把這些放置在每個頁面的頂部,但是如果用戶把三個cookies 都設置了,那么每一頁都可以 存取和使用這些用戶特定的變量。你還可以在一個cookie中設置三個變量,請看Ken Baumbach的文章 Cookie Basics with ASP,里面有設置變量的更多信息。
如果你認為用戶可能在瀏覽器上使Cookie 無效,這種方法就不適用。但是越來越多的站點要求使用 cookies,web 用戶也越來越熟練了。有可能相對很少的用戶會使cookies無效,但是這要在執行 這一方法之前進行考慮。 雖然上面的方法肯定能奏效,但是它們削弱了ASP的功能,因為它限制了其中一個關鍵組件--Session 對象的使用。要避免由負載平衡導致的這種限制,繼續使用sessions的一種方法是購買一個第三方 組件,可以比IIS更好地處理Session。
在本文中,我不想比較各種第三方組件的優缺點。但是我聽說有一個組件工作得挺好,是SoftArtisans 提供的,叫做 SA-Session Pro。它使用NT文件系統存儲用戶的信息,整個網絡范圍內的服務器都可以 使用。其它第三方組件創建“session 引擎”把網絡服務器和session 管理器分離。這樣,每次用戶 都可以被重定向到相同的session 引擎,同時也對服務器本身的點擊進行負載平衡。
另一個可選擇的第三方組件是Microsoft的成員服務器。它與Microsoft的站點服務器,它允許一個 站點處理狀態維護以外的問題。在Bill Pitzer的文章‘Moving your "Anonymous" visitors to registered status using Site Server and Membership Directory Authentication’中有更多的 信息。
由于ASP已經越來越成為企業級網絡應用程序的選擇,而負載平衡也成為這些應用程序成功的最大威脅, 在市場上會出現越來越多的第三方組件。ASP本身就是服務器對象或ActiveX組件,就是可以處理這些 插件的。
|