Hopes

          Start Here..

           

          Cookie/session/viewstate/cache



          1.COOKIE


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

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

                  // 如果不設置過期時間,默認關閉瀏覽器該cookie即失效

          新建項,為不同子鍵賦值
                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); // 通過設置過期時間來清除cookie


          2.CACHE


              應用程序級變量,存于服務器緩存中被所有用戶共享,由系統自動分配和回收,使用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 
          += "點擊清空后的cache數量:" + Cache.Count;

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

          3.SESSION


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

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

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

          1.在php中如何操作session:

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

          $_SESSION  //使用預定義全局變量操作數據

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

          簡單地操作,一切都是由服務器實現;由于處理在后臺,一切看起來也很安全。但是session采用什么樣機制,又是怎樣被實現,并且如何來保持會話的狀態的呢?



          2.session實現與工作原理

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

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

          如果客戶端瀏覽器意外關閉,服務器保存的session數據不是立即釋放,此時數據還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的信息;但是這個時候后臺的session還存在,但是session的保存有一個過期
          時間,一旦超過規定時間沒有客戶端請求時,他就會清除這個session。

          下面介紹一下session的存儲機制,默認的session是保存在files中,即以文件的方式保存session數據。在php中主要根據php.ini的配置session.save_handler
          來選擇保存session的方式。

          這里順便說明一下,如果要做服務器的lvs,即多臺server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
          一個簡單的memcache配置:
          session.save_handler = memcache
          session.save_path = "tcp://10.28.41.84:10001"

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

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



          3.實例問題
          現有系統A,B; 假設A系統是可以獨立運行的web系統,即可以和瀏覽器直接處理session, B系統是基于mobile的,需要調用A系統的功能接口,
          在保持A不改變的情況下,即登陸驗證,session存儲都不變的情況下,B系統能處理前端用戶的請求。

          這里提供的方案是使用PHP實現

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

          這樣B系統就能安全的調用A

          因為他的文件有一些還是保存在客戶端的,所以清楚客戶端最近歷史記錄文件,有時也會造成SEESSION失效

          4.VIEWSTATE

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

                   ViewState["table"]=DataTable;

                // 存放DataTable、Hashtable…對象讀取 ViewState

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

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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學習

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洛宁县| 临邑县| 揭阳市| 鄂托克旗| 虎林市| 资阳市| 新郑市| 临潭县| 盘锦市| 嫩江县| 缙云县| 鹰潭市| 万州区| 石泉县| 通渭县| 哈密市| 昭通市| 武威市| 临湘市| 宜城市| 七台河市| 广河县| 沂南县| 手机| 章丘市| 滦平县| 信宜市| 云霄县| 安多县| 淮北市| 夹江县| 伊宁市| 牙克石市| 河南省| 武功县| 新乐市| 辽宁省| 福建省| 柘城县| 平武县| 剑川县|