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
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ā)清楚while (ide.MoveNext())
{
Cache.Remove(ide.Key.ToString());
}
lbNumber.Text += "點(diǎn)擊清空后的cache數(shù)量:" + Cache.Count;
3.SESSION
系統(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) 編輯 收藏