天天看點

ASP.NET中利用cookies保持用戶端資訊

我目前所吃的東東都固定為食物,是以一點也不驚訝,這一周的主題為cookies。

cookies用于存儲特定使用者資訊,它提供了web程式中一種有用的方式。多年以來,javascript開發人員已經進行了有關cookie的大量工作。同樣,asp.net通過system.web空間名稱也提供了cookie的通路。雖然你不應該使用cookie來存儲一些敏感性的資料,但是,它們是處理鎖細資料的一個極好的選擇,比如顔色參數選擇或者最後一次通路日期。

傳遞cookies

cookie是存儲在用戶端計算機的一個小檔案。如果你是一個windows使用者,可以在使用者路徑中檢視cookies路徑,即為documentsandsettings路徑。這一路徑包含這一檔案名稱的文本檔案:

username@websitedomainthatcreatedthecookie

(使用者名稱@建立cookie的站點域名)

.netsystem.web空間名稱包含三個類,你可以使用它們來處理用戶端的cookies:

httpcookie:提供一個建立和操作獨立httpcookies的安全類型的方式。

httpresponse:cookies屬性允許用戶端cookies被操作。

httprequest:cookies屬性允許通路用戶端操作的cookies。

httpresponse和httprequest對象的cookies屬性将傳回一個httpcookiecollection對象,它包含着,将單獨的cookies添加到集合(collection)中,以及從集合(collection)獲得一個單獨的cookies。

httpcookie類

httpcookie類針對于客戶存儲之用而建立的單獨cookies。一旦httpcookie對象被建立,你可以将其添加到httpresponse對象的cookies屬性中。同樣的,你可以通過httprequest對象通路現有的cookies。httpcookie類包含以下的公有屬性:

domain(域名):獲得或設定與cookie有關的域名,可用于限制特定區域的cookie通路。

expires(期限):獲得或設定cookie的終止日期和時間,你可以将其設定為一個過去的日期以自動終止或者删除cookie。

names(名稱):獲得或設定cookie名稱。

path(路徑):獲得或設定cookie的虛拟路徑。這一屬性允許你限制cookie範圍,也就是說,通路cookie隻能限制于一個特定的檔案夾或者路徑。設定這一屬性限制為隻能通路特定路徑和該路徑下的所有檔案。

secure(安全):發信号以表示是否使用securesocketslayer(ssl)來發送cookie值。

value(值):獲得或設定一個單獨的cookie值。

values(資訊):傳回包含在cookie中的key/value的一個集合。

雖然這些還不是一個最詳盡的清單,但它提供了處理cookies所需要的東西。對于這些屬性的使用,以下vb.net範例給予最好的了解:

dimtestcookieasnewhttpcookie("lastvisited")

testcookie.value=datetime.now.tostring

testcookie.expires=datetime.now.adddays(7)

testcookie.domain="builder.com"

response.cookies.add(testcookie)

這一代碼段建立了一個名為lastvisited的新的cookie,并賦予目前日期和時間的值。同樣的,cookie終止期限設定為一個星期,相關的範圍為populated。一旦建立對象,通過response.cookies對象的add方法就可以将對象添加到用戶端的cookies集合。httpcookie構造函數中的方法有兩種:

httpcookieobjectname=newhttpcookie("cookiename")

httpcookieobjectname=newhttpcookie("cookiename","cookievalue")

同樣,response對象包含一個setcookie方法,這一方法可以接受一個httpcookie對象。

我的cookie在哪裡?

一旦cookies被儲存在用戶端,有多種不同的方法以提供你通路它們。如果你知道cookie名稱,可以使用httpresponse對象很容易地通路它的值。以下vb.net行顯示了與cookie有關的值:

response.write(request.cookies("lastvisitied").value)

除此之外,可以通過一個httpcookiecollection對象通路cookies的完整清單。這就使得cookie清單可以用一個for循環來通路。以下c#代碼說明了這樣的例子:

httpcookiecollectioncookies;

httpcookieonecookie;

cookies=request.cookies;

string[]cookiearray=cookies.allkeys;

for(inti=0;i<cookiearray.length;i++){

onecookie=cookies[cookiearray[i]];

response.write(onecookie.name+"-"+onecookie.value);

}

vb.net中相應的代碼如下:

dimiasinteger

dimonecookieashttpcookie

fori=0torequest.cookies.count-1

onecookie=request.cookies(i)

response.write(onecookie.name+"-"+onecookie.value)

nexti

穩定也是一個觀點

cookie檔案存放在用戶端機器,是以你的使用者可以任意删除或更改。此外,使用者還可以使cookies無效化。基于此原因,請記住不要依賴cookie資料。你應該将重要的資訊儲存在伺服器──特别是一個資料庫中。

在一個cookie中存儲關鍵資訊被認為是一種低級的程式設計,因為這些資訊很容易被洩露,原因是這些資訊位于客戶機器的一個檔案中。在這一點,一種方法就是使用ssl,這是一種可以避免敏感資訊的更好方法。

我可以使用cookies嗎?

使用者可以在自己的浏覽器上無效化cookie支援。你可以在自己的代碼中通路這些設定以決定是否支援cookies。request對象滿足了這一想法,以下vb.net代碼顯示了這一過程:

ifrequest.browser.cookies=truethen

'使用cookies

else

'沒有cookie支援

endif

可以聯合代碼來使用cookie值。以下c#代碼段對cookie支援進行了測試,并相應地将結果顯示在一個文本框:

if(request.browser.cookies==true)

{

if(request.cookies["lastvisited1"]==null)

httpcookienewcookie=newhttpcookie("lastvisited1",datetime.now.tostring());

newcookie.expires=datetime.now.addyears(1);

response.cookies.add(newcookie);

this.txtname.text="isthisyourfirsttime?";

}else{

this.txtname.text="wehaven'tseenyousince"+

request.cookies["lastvisited1"].value;

}}

你可以将這一代碼段添加到asp.net頁中的page_load事件。

儲存資料的另一方式

asp.net提供了儲存特定使用者資料的多種方法。其中一個老方法就是cookies。對于敏感資料,雖然cookies不是最好的方法,但它是諸如顔色參數選擇、最後一次通路日期等親和力選項(benignitems)的最佳選擇。雖然這些敏感資料重要,但當使用者的計算機崩潰時資料丢失,這也不是世界的末日。