披著羊皮的大野狼 Session

首席总指挥

首席总指挥

2016-01-29 19:43

披著羊皮的大野狼 Session,披著羊皮的大野狼 Session
       寫過稍微大型一點 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中著手:
  
  
  
  
    已經完成初始化了,但如何使用呢?我們只要在使用者登入的地方,把原本使用 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 上變數空間的號碼,你可以想像成銀行中有很多的保險箱,你擁有一支鑰匙,而鑰匙上有編號,鑰匙上的編號可以讓行員帶領你去你自己的保險箱。此方法尚還有改進之處,但對小型的應用程式已經是很夠用了。
  
  ■第二方案
  
    關於上一方案,你可能也想到,我們自訂的編號使用了 Session 來記錄,講到編
展开更多 50%)
分享

猜你喜欢

披著羊皮的大野狼 - Session

ASP
披著羊皮的大野狼 - Session

披著羊皮的大野狼 Session

ASP
披著羊皮的大野狼 Session

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

拌羊皮的吃法

猪肉
拌羊皮的吃法

怎样选择羊皮灯具?

生活常识
怎样选择羊皮灯具?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

阴茎做著做著就不行软了很怕会不会影

电脑网络
阴茎做著做著就不行软了很怕会不会影

怎么辨别纪梵希小羊皮的真假 纪梵希小羊皮的真假辨别

口红真假辨别 纪梵希 口红 彩妆
怎么辨别纪梵希小羊皮的真假 纪梵希小羊皮的真假辨别

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

解读LILO错误提示信息

解读LILO错误提示信息

使用 find 搜索文件

使用 find 搜索文件
下拉加载更多内容 ↓