posts - 60,comments - 71,trackbacks - 0

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

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

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

          默認情況下session是存在inetinfo.exe進程中的
          .Net中session是可以存在sql server中的,很強

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

          真是一篇好文,呵呵,收藏了.
          posted on 2008-06-19 09:23 henry1451 閱讀(1553) 評論(0)  編輯  收藏 所屬分類: Jsp,Js,Ajax,Html技術
          主站蜘蛛池模板: 彭泽县| 兴国县| 石泉县| 万盛区| 辽阳市| 息烽县| 安新县| 连州市| 元谋县| 桃江县| 封开县| 固阳县| 贞丰县| 来安县| 建平县| 广河县| 南阳市| 多伦县| 罗平县| 卓资县| 东兴市| 孙吴县| 鄯善县| 延津县| 榕江县| 兰州市| 香港 | 保康县| 额济纳旗| 蓬安县| 陵川县| 朝阳市| 五寨县| 凤台县| 五河县| 清水河县| 柳河县| 汾阳市| 吉木萨尔县| 东丰县| 铁岭市|