本文來自:http://onewww.net/blog/article.asp?id=38
一句話就是,一般情況下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)為我沒有登陸!

于是決定好好研究下.
為什么登陸后,只要不關(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
真是一篇好文,呵呵,收藏了.