posts - 60,comments - 71,trackbacks - 0

          本文來自:http://onewww.net/blog/article.asp?id=38

          今天突然發(fā)現(xiàn)我對(duì)Session有很大的誤解.
          一句話就是,一般情況下Session是需要Cookie支持的!
          大家都知道Session是在服務(wù)器端保存客戶狀態(tài)的,只要瀏覽器不關(guān)閉,就可以一直保存該用戶的信息,通常用做來保存是否登陸信息等.而Cookie與其剛好相反,它將信息保存到客戶端,它是寫入文件的,俗成小甜點(diǎn)..
          今天做了個(gè)程序,是判斷是否登陸成功的,沒有使用Cookie,而全部使用的Session機(jī)制實(shí)現(xiàn)的.本來很好用,可吃完午飯后,突發(fā)起想的把瀏覽器的cookie禁止了,這時(shí)候產(chǎn)生了一件讓我很驚訝的事情session竟然不好用了,也就是說,無論我怎么登陸系統(tǒng),系統(tǒng)都認(rèn)為我沒有登陸! 當(dāng)我把cookie打開后session就好用了,系統(tǒng)也恢復(fù)正常了?!這是怎么會(huì)事?感覺我和思維中的某種原則性的東西沖突了
          于是決定好好研究下.
          為什么登陸后,只要不關(guān)閉瀏覽器,session就能一直存在?當(dāng)然session的數(shù)據(jù)是保存在服務(wù)器上的,但服務(wù)器是怎么識(shí)別這些數(shù)據(jù)都是誰的呢?答案是sessionid,每一個(gè)瀏覽者都唯一的sessionid,這就很好的區(qū)分了不同瀏覽者的不同session了.sessionid是怎么產(chǎn)生的?應(yīng)該是第一次訪問服務(wù)器的時(shí)候隨即生成的.假如是111,然后他的登陸信息是true,服務(wù)器就知道sessionid為111已經(jīng)登陸了,這些信息都存在了服務(wù)器上了.但當(dāng)瀏覽者繼續(xù)操作的時(shí)候,也就是打開該系統(tǒng)的另一個(gè)頁面的時(shí)候sessionid怎么辦?如何傳遞?打開另一個(gè)頁面的時(shí)候其實(shí)相當(dāng)于重新訪問系統(tǒng),如果沒有特殊的處理機(jī)制,系統(tǒng)會(huì)再次重新分配一個(gè)sessionid的,這樣的話就失去意義了~!所以sessionid在第一次訪問后應(yīng)該存在了客戶端.能寸哪呢?當(dāng)然,只能寸在cookie中了,這就是為什么關(guān)閉cookie,session就失去作用了
          找到這么個(gè)例子來描述cookie session的關(guān)系再恰當(dāng)不過了
          一家咖啡店有喝5杯咖啡免費(fèi)贈(zèng)一杯咖啡的優(yōu)惠,然而一次性消費(fèi)5杯咖啡的機(jī)會(huì)微乎其微,這時(shí)就需要某種方式來紀(jì)錄某位顧客的消費(fèi)數(shù)量。想象一下其實(shí)也無外乎下面的幾種方案:
          1、該店的店員很厲害,能記住每位顧客的消費(fèi)數(shù)量,只要顧客一走進(jìn)咖啡店,店員就知道該怎么對(duì)待了。這種做法就是協(xié)議本身支持狀態(tài)。
          2、發(fā)給顧客一張卡片,上面記錄著消費(fèi)的數(shù)量,一般還有個(gè)有效期限。每次消費(fèi)時(shí),如果顧客出示這張卡片,則此次消費(fèi)就會(huì)與以前或以后的消費(fèi)相聯(lián)系起來。這種做法就是在客戶端保持狀態(tài)。
          3、發(fā)給顧客一張會(huì)員卡,除了卡號(hào)之外什么信息也不紀(jì)錄,每次消費(fèi)時(shí),如果顧客出示該卡片,則店員在店里的紀(jì)錄本上找到這個(gè)卡號(hào)對(duì)應(yīng)的紀(jì)錄添加一些消費(fèi)信息。這種做法就是在服務(wù)器端保持狀態(tài)。
          第一種情況暫時(shí)不考慮.看第二種情況,卡片無疑就是cookie了,所有的數(shù)據(jù)如果都存在卡片上是不安全的,也是容易遺失的(卡片被修改了?卡片遺失了?這都是有可能的).所以才用了第三種情況.客戶除了個(gè)會(huì)員號(hào)再什么信息也沒有,這是最安全的,但這個(gè)會(huì)員號(hào)必須是客戶自己知道的!也就是cookie中必須存儲(chǔ)的.
          這樣解釋我今天中午遇到的情況就不驚訝了.

          無cookie的解決辦法是利用URL重寫技術(shù),就是把sessionid的數(shù)據(jù)保存在url后面http://onewww.net/a.asp?sessionid=111
          在.net中,可以用Web.config配置
          就是把cookieless="false"改為:cookieless="true"就可以了
          還有一種方法是利用表單隱藏字段技術(shù),就是加個(gè)input type='hide'的元素.這中技術(shù)也在.Net中大量使用,尤其是.Net中的控件.個(gè)人很不喜歡這種技術(shù),因?yàn)榧哟罅肆髁?數(shù)據(jù)都是加密的.體積成倍增加)

          默認(rèn)情況下session是存在inetinfo.exe進(jìn)程中的
          .Net中session是可以存在sql server中的,很強(qiáng)

          PS:
          今天看到firefox2支持客戶端Session保存,我理解的是不利用cookie了,直接就支持.其實(shí)IE很早就支持了!只是沒有普及.應(yīng)該是個(gè)很好的技術(shù).以前看過,忘記在哪看的了,以后找到再補(bǔ)充上來.現(xiàn)在firefox也支持了,估計(jì)又要掀起一次小小的革命了.哈哈.個(gè)人觀點(diǎn)
          firefox 2支持session的英文資料 我是看不明白地..
          http://www.whatwg.org/specs/web-apps/current-work/#scs-client-side

          真是一篇好文,呵呵,收藏了.
          posted on 2008-06-19 09:23 henry1451 閱讀(1553) 評(píng)論(0)  編輯  收藏 所屬分類: Jsp,Js,Ajax,Html技術(shù)
          主站蜘蛛池模板: 许昌县| 汨罗市| 蒙城县| 和顺县| 措美县| 黔东| 临夏市| 彩票| 湟源县| 叙永县| 邛崃市| 青阳县| 多伦县| 麻栗坡县| 仪陇县| 大余县| 海兴县| 施秉县| 光泽县| 怀来县| 渝北区| 方山县| 茂名市| 新竹市| 高青县| 巴青县| 宝丰县| 雅江县| 呼玛县| 荆门市| 正安县| 周至县| 华阴市| 宁蒗| 大同市| 丰县| 上犹县| 凉城县| 河北区| 博乐市| 同仁县|