Session, Cookie, Web.config中的cookieless總結

 1.Session存在server上, asp.net有幾種存儲方式, 一是inproc, 二是sqlserver, 三是stateserver, 四是可以放到Appfabric Caching中去(這是.net 4.0中新加的).

2.Cookie存在客戶端瀏覽器裏, 如果加上expired, 則會保存到客戶硬盤上去. 用戶可以啓用cookie, 也可以關閉cookie, 就這個自由, 導致的問題就來了.

3.網站如何識別已登錄用戶呢?

   用戶訪問網站時, 網站會分配一個sessionID給該瀏覽器, 這個sessionID存在於客戶端的cookie中, 這樣, 客戶再請求訪問網站的其它頁面時, 服務器見到這個客戶請求, 一檢查cookie, 發現有sessionID, 於是就知道誰已登錄的用戶, 誰是未登錄的了. 

就是這個樣子的:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 22 Jun 2011 09:37:53 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=zvsoy5xcsvflpdzso40s52se; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 2430
Connection: Close

4.如果客戶端禁止使用cookie呢?

   cookie不是很安全, 於是就有人禁止關閉它.

   這樣, 瀏覽器SessionID無法存入cookie中, 這樣, 網站就不能識別用戶了, 也就導致所有人都無法登錄了, 而這時, 解決辦法就是, 修改web.config中cookieless="true", 即可解決某些用戶禁用cookie這個問題.

   <sessionState cookieless="true" mode="StateServer" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30" />

   cookieless="true"的官方解釋是:如果用戶瀏覽器不支持Cookie時啓用會話狀態, 看得不是很懂得樣子.

   不懂沒關係, 實踐一下, 這時再訪問網站, 就會在url中多出一些字符 (如 http://localhost/(S(hbbvecjstz42edqcjobbyh45))/login.aspx) , 這就是把SessionID放Url中了, 不是不讓放cookie中嗎? 那就只好放url中了, 感覺很醜陋了. 

   技術上, cookieless的意思就是這樣, 但實際上估計沒有網站會這麼幹的, 直接告訴用戶起用cookie不就完了, 不啓用cookie就別訪問我的網站, 愛來不來, 誰怕誰?

 

下面兩篇文章非常好, 推薦一下:

1. Session與Cookie(轉)
http://www.blogjava.net/henry1451/articles/209066.html?_sm_byp=iVVHtw6wWV103RW3

裏面舉的咖啡的例子很好:

一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支持狀態。
2、發給顧客一張卡片,上面記錄着消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯繫起來。這種做法就是在客戶端保持狀態。
3、發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裏的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在服務器端保持狀態。
第一種情況暫時不考慮.看第二種情況,卡片無疑就是cookie了,所有的數據如果都存在卡片上是不安全的,也是容易遺失的(卡片被修改了?卡片遺失了?這都是有可能的).所以才用了第三種情況.客戶除了個會員號再什麼信息也沒有,這是最安全的,但這個會員號必須是客戶自己知道的!也就是cookie中必須存儲的.

2. ASP.NET Session Management Internals
http://www.codeproject.com/KB/session/ASPNETSessionInternals.aspx?_sm_byp=iVVHtw6wWV103RW3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章