Hopes

          Start Here..

           

          Cookie/session/viewstate/cache



          1.COOKIE


          這個(gè)保存在客戶端的信息,用戶清除了本機(jī)上的COOKIE文件或過期了就沒有了。保存在客戶端,通過 Expries 設(shè)置有效期(可長可短,默認(rèn)關(guān)閉瀏覽器cookie即失效)。
          新建項(xiàng)并賦值:
                 Response.Cookies["ckName"].Value = "Sutdent";

                 Response.Cookies["ckName"].Expires = DateTime.Now.AddSeconds(10);

                  // 如果不設(shè)置過期時(shí)間,默認(rèn)關(guān)閉瀏覽器該cookie即失效

          新建項(xiàng),為不同子鍵賦值
                Response.Cookies["ckAge"]["boy"] = "25";
                Response.Cookies["ckAge"]["girl"] = "22";
                Response.Cookies["ckAge"].Expires = DateTime.Now.AddHours(1);
                // Response.Cookies["ckAge"].Expires = DateTime.Now.AddHours(-1); // 通過設(shè)置過期時(shí)間來清除cookie


          2.CACHE


              應(yīng)用程序級(jí)變量,存于服務(wù)器緩存中被所有用戶共享,由系統(tǒng)自動(dòng)分配和回收,使用Cache["name"]==null?判斷是否過期。
              Cache["number"] = "65464646";
              Cache["ca"] = "aaa";
              Cache["cb"] = "bbb";

              lbNumber.Text +="OldCache value:"+ Cache["number"].ToString();


          清空緩存:

          IDictionaryEnumerator ide = Cache.GetEnumerator();
          while (ide.MoveNext())
          {
          Cache.Remove(ide.Key.ToString());
          }
          lbNumber.Text 
          += "點(diǎn)擊清空后的cache數(shù)量:" + Cache.Count;

             在客戶端是無法清空和刷新的,如果要的話可能要修改WEB.CONFIG和IIS的重啟,或者提供頁面方法,觸發(fā)清楚

          3.SESSION


          頁面級(jí)變量,保存在服務(wù)器端,通過 Timeout 設(shè)置超時(shí)時(shí)間(可長可短,默認(rèn)30分鐘)。
          系統(tǒng)為每位訪問者自動(dòng)分配一個(gè) sessionid(超時(shí)重新分配),使之互不影響,生命周期與訪問者會(huì)話時(shí)間相同。
          Session["scName"] = string.IsNullOrEmpty(scName.Value)?"default session string":scName.Value;
          Session.Timeout = 11; // 時(shí)間單位是分鐘
          lbSession.Text = Session["scName"].ToString();

          通過項(xiàng)名稱刪除 session
          Session.Remove("scName"); // 刪除單條session
          Session.Clear(); // 清空session
          lbSession.Text = "session is clesred, please refreash.";

          session的工作原理 
          一直在使用session存儲(chǔ)數(shù)據(jù),一直沒有好好總結(jié)一下session的使用方式以及其工作原理,今天在這里做一下梳理。
          這里的介紹主要是基于php語言,其他的語言操作可能會(huì)有差別,但基本的原理不變。

          1.在php中如何操作session:

          session_start(); //使用該函數(shù)打開session功能

          $_SESSION  //使用預(yù)定義全局變量操作數(shù)據(jù)

          使用unset($_SESSION['key']) //銷毀一個(gè)session的值

          簡(jiǎn)單地操作,一切都是由服務(wù)器實(shí)現(xiàn);由于處理在后臺(tái),一切看起來也很安全。但是session采用什么樣機(jī)制,又是怎樣被實(shí)現(xiàn),并且如何來保持會(huì)話的狀態(tài)的呢?



          2.session實(shí)現(xiàn)與工作原理

          瀏覽器和服務(wù)器采用http無狀態(tài)的通訊,為了保持客戶端的狀態(tài),使用session來達(dá)到這個(gè)目的。然而服務(wù)端是怎么樣標(biāo)示不同的客戶端或用戶呢?
          這里我們可以使用生活中的一個(gè)例子,假如你參加一個(gè)晚會(huì),認(rèn)識(shí)了很多人,你會(huì)采取什么方式來區(qū)分不同的人呢!你可能根據(jù)臉型,也有可能根據(jù)用戶的名字,
          或者人的身份證,即采用一個(gè)獨(dú)一無二的標(biāo)示。在session機(jī)制中,也采用了這樣的一個(gè)唯一的session_id來標(biāo)示不同的用戶,不同的是:瀏覽器每次請(qǐng)求都會(huì)帶上
          由服務(wù)器為它生成的session_id.

          簡(jiǎn)單介紹一下流程:當(dāng)客戶端訪問服務(wù)器時(shí),服務(wù)器根據(jù)需求設(shè)置session,將會(huì)話信息保存在服務(wù)器上,同時(shí)將標(biāo)示session的session_id傳遞給客戶端瀏覽器,
          瀏覽器將這個(gè)session_id保存在內(nèi)存中(還有其他的存儲(chǔ)方式,例如寫在url中),我們稱之為無過期時(shí)間的cookie。瀏覽器關(guān)閉后,這個(gè)cookie就清掉了,它不會(huì)存在用戶的cookie臨時(shí)文件。
          以后瀏覽器每次請(qǐng)求都會(huì)額外加上這個(gè)參數(shù)值,再服務(wù)器根據(jù)這個(gè)session_id,就能取得客戶端的數(shù)據(jù)狀態(tài)。

          如果客戶端瀏覽器意外關(guān)閉,服務(wù)器保存的session數(shù)據(jù)不是立即釋放,此時(shí)數(shù)據(jù)還會(huì)存在,只要我們知道那個(gè)session_id,就可以繼續(xù)通過請(qǐng)求獲得此session的信息;但是這個(gè)時(shí)候后臺(tái)的session還存在,但是session的保存有一個(gè)過期
          時(shí)間,一旦超過規(guī)定時(shí)間沒有客戶端請(qǐng)求時(shí),他就會(huì)清除這個(gè)session。

          下面介紹一下session的存儲(chǔ)機(jī)制,默認(rèn)的session是保存在files中,即以文件的方式保存session數(shù)據(jù)。在php中主要根據(jù)php.ini的配置session.save_handler
          來選擇保存session的方式。

          這里順便說明一下,如果要做服務(wù)器的lvs,即多臺(tái)server的話,我們一般使用memcached的方式session,否則會(huì)導(dǎo)致一些請(qǐng)求找不到session。
          一個(gè)簡(jiǎn)單的memcache配置:
          session.save_handler = memcache
          session.save_path = "tcp://10.28.41.84:10001"

          當(dāng)然如果一定要使用files文件緩存,我們可以將文件作nfs,將所有的保存session文件定位到一個(gè)地方。

          剛才講返回給用戶的session-id最終保存在內(nèi)存中,這里我們也可以設(shè)置參數(shù)將其保存在用戶的url中。



          3.實(shí)例問題
          現(xiàn)有系統(tǒng)A,B; 假設(shè)A系統(tǒng)是可以獨(dú)立運(yùn)行的web系統(tǒng),即可以和瀏覽器直接處理session, B系統(tǒng)是基于mobile的,需要調(diào)用A系統(tǒng)的功能接口,
          在保持A不改變的情況下,即登陸驗(yàn)證,session存儲(chǔ)都不變的情況下,B系統(tǒng)能處理前端用戶的請(qǐng)求。

          這里提供的方案是使用PHP實(shí)現(xiàn)

          在用戶登陸成功后,將保存的session的session-id返回給B系統(tǒng),然后B系統(tǒng)每次請(qǐng)求其他接口都帶session_id。
          A系統(tǒng)在session_start前加上session_id(session_id);

          這樣B系統(tǒng)就能安全的調(diào)用A

          因?yàn)樗奈募幸恍┻€是保存在客戶端的,所以清楚客戶端最近歷史記錄文件,有時(shí)也會(huì)造成SEESSION失效

          4.VIEWSTATE

          頁面級(jí)變量(可以看作頁面Session),可保存各種變量。保存變量到 ViewState
                   ViewState["number"]=123456;

                   ViewState["table"]=DataTable;

                // 存放DataTable、Hashtable…對(duì)象讀取 ViewState

          times=(int)ViewState["number"];
          table=(DataTable)ViewState["table"];

          posted on 2012-09-09 12:17 ** 閱讀(219) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊(cè)

          收藏夾

          C#學(xué)習(xí)

          友情鏈接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 陵水| 略阳县| 衡山县| 南开区| 罗城| 邓州市| 嵩明县| 河津市| 临邑县| 临海市| 天等县| 洪雅县| 石嘴山市| 谷城县| 舞阳县| 揭阳市| 望城县| 安岳县| 连平县| 安仁县| 平舆县| 建湖县| 顺义区| 中西区| 工布江达县| 岳西县| 静海县| 柞水县| 新邵县| 汾西县| 珲春市| 施甸县| 获嘉县| 陕西省| 拜城县| 秭归县| 宁安市| 芦溪县| 翼城县| 河东区| 克什克腾旗|