Cookie就是所謂的" 小甜餅" ,他最早出現是在Netscape Navigator 2.0中。Cookie其實就是由Web伺服器建立的、將資訊儲存在電腦上的檔案。那麼為什麼Web伺服器要在客戶機上面建立如此檔案?這是因為當客戶機發送一個請求到WEB伺服器時(譬如準備瀏覽頁面時),無論此客戶機是否是第一次來訪,伺服器都會把它當作第一次來對待,WEB伺服器所做的工作只是簡單的進行響應,然後就關閉與該使用者的串連。這樣處理過程所帶來的缺點時顯而易見的。自從網景公司開發出Cookie以後,就可以利用Cookie來儲存使用者的識別資訊。Cookie的作用可以記錄了您在該網站上曾經訪問過的頁面,由此協助您下次訪問該網站時自訂查看。Cookies 也可以儲存個人可識別資訊。個人可識別資訊是可以用來識別或聯絡您的資訊,例如姓名、電子郵件地址、家庭或工作地址,或者電話號碼。然而,網站只能訪問您提供的個人可識別資訊。例如,除非您提供電子郵件名稱,否則網站將不能確定您的電子郵件名稱。另外,網站不能通過Cookie來訪問電腦上的其他資訊。當然除非你提供。那麼Cookie到底存放在什麼地方?如果機器的系統是視窗98且安裝在" C" 盤中,那麼Cookie存放在" C:/Windows/Cookies" 目錄中;如果機器系統是視窗2000且安裝在" C" 盤中,那麼Cookie存放在" C:/Documents and Settings/Administrator/Cookies" 目錄中。瞭解了Cookie這麼多知識,我們還是來瞭解一下本文的重點-- C#是如何進行Cookie方面編程的。主要內容有二點:其一是 C#是如何寫入Cookie;其二是 C#是如何訪問自己寫入的Cookie。
一、本文介紹的程式設計和啟動並執行軟體環境:
微軟公司視窗2000伺服器版
.Net FrameWork SDK Beta 2
C#進行Cookie方面編程是通過ASP.NET頁面來實現的。
二、C#如何寫入Cookie:
為了寫入Cookie,他的步驟主要有三步,具體如下:
首先就要建立一個HttpCookie對象,通過這個對象來構造一個Cookie,這個對象的名稱就是以後產生的Cookie名稱。具體如下代碼:
HttpCookie cookie = new HttpCookie ( " 使用者定義的Cookie名稱" ) ;
然後對建立的HttpCookie對象的" Value" 屬性分配一個字串值," Value" 的值就是後來產生的Cookie的值。具體代碼如下:
cookie.Value = "使用者給Cookie賦值" ; 如果你想寫入的Cookie數值不是一個簡單的字串,而是一個複雜的資料類型,我們知道這些資料類型是不能直接存貯到Cookie中的,因為Cookie中只能存貯字串。但你可以通過一個變通的方法,就是把這個複雜的資料類型轉換成多個字串,然後把這多個字串同時賦值給產生的Cookie值,這樣Cookie中的內容就豐富了,以後利用Cookie完成的功能也強大了。這時你可能就會為什麼當你瀏覽Web伺服器,Web伺服器會知道你什麼時候曾經瀏覽過,並且曾經待過多長時間等資訊了。因為這些資訊已經儲存到你第一次瀏覽頁面時,Web伺服器產生的Cookie中去了。下列代碼是把多個字串儲存到Cookie的例子:
cookie [ " 姓名" ] = " 王天";
cookie [ " 性別" ] = " 男";
cookie [ " 年齡" ] = " 26";
Cookie有臨時的,也有永遠的。永久 Cookie 以檔案形式儲存在電腦上,關閉 Internet Explorer 時仍然保留在電腦上。再次訪問該網站時,建立該 Cookie 的網站可以讀取。在具體的編程時候,是在寫入此Cookie的時候,設定Cookie的生命週期,具體如下代碼:
DateTime dtNow = DateTime . Now ;
TimeSpan tsMinute = new TimeSpan ( 0 , 1 , 0 , 0 ) ;
cookie . Expires = dtNow + tsMinute ;
以上代碼是設定產生的Cookie的生命期為" 一個小時" ,你可以通過修改" TimeSpan" 屬性來設定產生Cookie的具體生命期。
.最後調用" Response.Cookies" 對象的" Add()" 方法,加入此對象,這樣就可以產生一個Cookie了。具體代碼如下:
Response . Cookies . Add ( cookie ) ;
下列代碼就是在 C#寫入Cookie的完整代碼(Write.aspx):
<% @ language = "C#" %>
<script runat = "server" >
void WriteClicked ( Object Sender , EventArgs e )
{
//建立一個HttpCookie對象
HttpCookie cookie = new HttpCookie ( NameField . Text ) ;
//設定此cookies值
cookie . Value = ValueField . Text ;
//設定cookie的生命週期,在這裡定義為一個小時
DateTime dtNow = DateTime . Now ;
TimeSpan tsMinute = new TimeSpan ( 0 , 1 , 0 , 0 ) ;
cookie . Expires = dtNow + tsMinute ;
cookie [ "姓名" ] = "王天" ;
cookie [ "性別" ] = "男" ;
cookie [ "年齡" ] = "26" ;
//加入此cookie
Response . Cookies . Add ( cookie ) ;
Response . Write ( NameField . Text + "Cookie建立完畢 <br > <hr > " ) ;
}
</script >
<html >
<body >
<h3 > 在 C#頁面中建立cookie </h3 >
此cookie的生命週期定義為一個小時
<form runat="server">
Cookie名稱:<asp:textbox id = "NameField" runat = "server" /> <br >
Cookie的值:<asp:textbox id = "ValueField" runat = "server" /> <br >
<asp:button text = "建立Cookie" onclick = "WriteClicked" runat = "server" /> <br >
</form >
</body >
</html >
是上面代碼運行後的介面:
圖01:C#寫入Cookie的程式運行介面
當然上面的代碼產生的Cookie在內容上面有點單調了。其實對於內容十分豐富的Cookie來說,他還有許多屬性,充分的利用這些屬性,才可以利用了Cookie的強大功能。下表是Cookie的一些常用的屬性:
屬性 描述
Domain 設定/獲得Cookie應屬於的網域名稱。一旦設定了此屬性,則只限定於此網域名稱的Web伺服器訪問此Cookie。可以設定為"ccw.com.cn"
Path 設定/獲得Cookie應屬於的路徑,如果設定後,則訪問此Cookie的Web頁面則被限定在此路徑裡面。其他路徑的Web頁面則不能訪問。
Secure 設定/獲得一個標識來表明利用HTTP協議是否能夠安全的傳輸Cookie到用戶端的瀏覽器。
HasKeys 表明是否此Cookie是否是多個字串組成的。
在寫入Cookie的時候,最大限度的利用這些屬性,對於最大程度的利用寫入的Cookie是十分重要的。
三、C#是如何讀取已產生的Cookie:
讀取指定的Cookie比起寫入Cookie要來的容易的多了,只需要使用" Request.Cookies" 對象就可以完成。下面是讀取指定Cookie名稱的方法:
HttpCookie cookie = Request.Cookies [ " Cookie的名稱" ] ;
下面是顯示已經讀取了的Cookie的數值:
Response.Write (cookie . Value . ToString ( ) ) ; 掌握了上面的要點,讀取Cookie就顯得非常容易了,下列是讀取Cookie的程式碼(read.aspx): <% @ language = "C#" %>
<script runat = "server" >
void ReadClicked ( Object Sender , EventArgs e )
{
//得到使用者輸入的cookie名稱
String strCookieName = NameField . Text ;
//獲得cookie
HttpCookie cookie = Request.Cookies [ strCookieName ] ;
//確定是否存在使用者輸入的cookie
if ( null == cookie ) {
Response.Write ( "沒有發現指定的cookie <br > <hr > " ) ;
}
else {
//找到指定的cookie,顯示cookie的值
String strCookieValue = cookie . Value . ToString ( ) ;
Response.Write ( strCookieName + " cookie 的值為: <b > "
+ strCookieValue + " </b > <br > <hr > " ) ;
}
}
</script >
<html >
<body >
在 C#頁面中讀取指定Cookie值<br >
<form runat = "server" >
請輸入要讀取的Cookie名稱:
<asp:button text = "讀取cookie" onclick = "ReadClicked" runat = "server" />
</form >
</body >
</html >
是上面代碼運行後的介面:
圖02:讀取指定Cookie的值的程式運行介面
四、總結:
至此我們已經介紹了用 C#進行Cookie編程的大部分內容。其實Cookie在互連網上有著比較大的作用。譬如它可讓WEB網站跟蹤特定訪問者的訪問次數、最後訪問時間和訪問者進入網站的路徑等;還可告訴線上廣告商廣告被點擊的次數,從而可以更精確的投放廣告;它可讓使用者在不鍵入密碼和使用者名稱的情況下進入曾經瀏覽過的一些網站;最為重要的是它可協助網站統計使用者資料以實現個人化服務等等。掌握了 C#的Cookie編程,就可以在程式中充分利用Cookie來實現上面的這些功能了。不信你試一試。
javascript中cookie 問題
- <script>
- //寫cookies函數 作者:翟振凱
- function SetCookie(name,value)//兩個參數,一個是cookie的名子,一個是值
- {
- var Days = 30; //此 cookie 將被儲存 30 天
- var exp = new Date(); //new Date("December 31, 9998");
- exp.setTime(exp.getTime() + Days*24*60*60*1000);
- document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
- }
- function getCookie(name)//取cookies函數
- {
- var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
- if(arr != null) return unescape(arr[2]); return null;
- }
- function delCookie(name)//刪除cookie
- {
- var exp = new Date();
- exp.setTime(exp.getTime() - 1);
- var cval=getCookie(name);
- if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
- }
- SetCookie ("xiaoqi", "3")
- alert(getCookie('xiaoqi'));
- </script>
一個非常實用的javascript讀寫Cookie函數
一個非常實用的javascript讀寫Cookie函數
- function GetCookieVal(offset)
- //獲得Cookie解碼後的值
- {
- var endstr = documents.cookie.indexOf (";", offset);
- if (endstr == -1)
- endstr = documents.cookie.length;
- return unescape(documents.cookie.substring(offset, endstr));
- }
- function SetCookie(name, value)
- //設定Cookie值
- {
- var expdate = new Date();
- var argv = SetCookie.arguments;
- var argc = SetCookie.arguments.length;
- var expires = (argc > 2) ? argv[2] : null;
- var path = (argc > 3) ? argv[3] : null;
- var domain = (argc > 4) ? argv[4] : null;
- var secure = (argc > 5) ? argv[5] : false;
- if(expires!=null) expdate.setTime(expdate.getTime() + ( expires * 1000 ));
- documents.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))
- +((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
- +((secure == true) ? "; secure" : "");
- }
- function DelCookie(name)
- //刪除Cookie
- {
- var exp = new Date();
- exp.setTime (exp.getTime() - 1);
- var cval = GetCookie (name);
- documents.cookie = name + "=" + cval + "; expires="+ exp.toGMTString();
- }
- function GetCookie(name)
- //獲得Cookie的原始值
- {
- var arg = name + "=";
- var alen = arg.length;
- var clen = documents.cookie.length;
- var i = 0;
- while (i < clen)
- {
- var j = i + alen;
- if (documents.cookie.substring(i, j) == arg)
- return GetCookieVal (j);
- i = documents.cookie.indexOf(" ", i) + 1;
- if (i == 0) break;
- }
- return null;
- }
- <SCRIPT language="javascript">
- <!--
- function openpopup(){
- url="popup.htm"
- window.open("gonggao.htm","gonggao","width=260,height=212,left=200,top=0")
- }
- function get_cookie(Name) {
- var search = Name + "="
- var returnvalue = "";
- if (documents.cookie.length > 0) {
- offset = documents.cookie.indexOf(search)
- if (offset != -1) {
- offset += search.length
- end = documents.cookie.indexOf(";", offset);
- if (end == -1)
- end = documents.cookie.length;
- returnvalue=unescape(documents.cookie.substring(offset, end))
- }
- }
- return returnvalue;
- }
- function helpor_net(){
- if (get_cookie('popped')==''){
- openpopup()
- documents.cookie="popped=yes"
- }
- }
- helpor_net()
- //-->
- </SCRIPT>
如果點了確定,只要不清cookie,以後訪問都不會再提示,如果不點確定則每次都會提示。放在js檔案裡,全站包含
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- var the_cookie = document.cookie;
- var broken_cookie = the_cookie.split(":");
- var the_visiteraccepted = unescape(broken_cookie[1]);
- //
- if (the_visiteraccepted=="undefined"){
- var tmp=confirm('中國人何時何地。');
- if(tmp==false){
- window.close();
- }else{
- var the_visiteraccepted = 1;
- var the_cookie = "ILoveChina=visiteraccepted:" + escape(the_visiteraccepted);
- document.cookie = the_cookie;
- }
- }
- //-->
- </SCRIPT>
1. Cookie的相容性問題
Cookie的格式有2個不同的版本,第一個版本,我們稱為Cookie Version 0,是最初由Netscape公司制定的,也被幾乎所有的瀏覽器支援。而較新的版本,Cookie Version 1,則是根據RFC 2109文檔制定的。為了確保相容性,JAVA規定,前面所提到的涉及Cookie的操作都是針對舊版本的Cookie進行的。而新版本的Cookie目前還不被Javax.servlet.http.Cookie包所支援。
2. Cookie的內容
同樣的Cookie的內容的字元限制針對不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字元,例如:空格,方括弧,圓括弧,等號(=),逗號,雙引號,斜杠,問號,@符號,冒號,分號都不能作為Cookie的內容