PHP中Cookie及其使用
添加時(shí)間:2014-7-23 16:22:45
添加:
思海網(wǎng)絡(luò)
Cookie技術(shù)是一個(gè)非常有爭(zhēng)議的技術(shù),自經(jīng)誕生它就成了廣大網(wǎng)絡(luò)用戶和Web開(kāi)發(fā)人員的一個(gè)爭(zhēng)論焦點(diǎn)。有一些網(wǎng)絡(luò)用戶,甚至包括一些資深的Web專(zhuān)家也對(duì)它的產(chǎn)生和推廣感到不滿,這倒不是因?yàn)镃ookie技術(shù)的功能太弱或別的技術(shù)性能上的原因,而僅僅是因?yàn)樗麄冇X(jué)得Cookie 的使用,對(duì)網(wǎng)絡(luò)用戶的隱私構(gòu)成了危害。因?yàn)镃ookie是由Web服務(wù)器保存在用戶瀏覽器上的小文本文件,它包含有關(guān)用戶的信息(如身份識(shí)別號(hào)碼、密碼、用戶在Web站點(diǎn)上購(gòu)物的方式或用戶訪問(wèn)該站點(diǎn)的次數(shù))。
那么Cookie 技術(shù)究竟怎樣呢?是否真的給網(wǎng)絡(luò)用戶帶來(lái)了個(gè)人隱私的危害呢?還是讓我們看了下面的內(nèi)容,再做回答吧。
(1)Cookie技術(shù)簡(jiǎn)介
在WEB技術(shù)發(fā)展史上,Cookie技術(shù)的出現(xiàn)是一個(gè)重大的變革。最先是Netscape在它的Netscape Navigator瀏覽器中引入了Cookie技術(shù),從那時(shí)起,World Wide Web 協(xié)會(huì)就開(kāi)始支持Cookie標(biāo)準(zhǔn)。以后又經(jīng)過(guò)微軟的大力推廣(因?yàn)槲④浀腎IS Web服務(wù)器所采用的ASP技術(shù)很大程度的使用了Cookie技術(shù)),即在微軟的Internet Explorer瀏覽器中完全支持Cookie技術(shù)。到現(xiàn)在,絕大多數(shù)的瀏覽器都支持Cookie技術(shù),或者至少兼容Cookie技術(shù)的使用。
1)什么是Cookie?
按照Netscape官方文檔中的定義,Cookie是在HTTP協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的 一種方式。Cookie 是由Web服務(wù)器保存在用戶瀏覽器上的小文本文件,它可以包含有關(guān)用戶的信息(如身份識(shí)別號(hào)碼、密碼、用戶在Web站點(diǎn)購(gòu)物的方式或用戶訪問(wèn)該站點(diǎn)的次數(shù))。無(wú)論何時(shí)用戶鏈接到服務(wù)器,Web站點(diǎn)都可以訪問(wèn)Cookie信息。
通俗地講,瀏覽器用一個(gè)或多個(gè)限定的文件來(lái)支持Cookie。這些文件在使用Windows操作系統(tǒng)的機(jī)器上叫做Cookie 文件,在Macintosh機(jī)器上叫做magic Cookie 文件,這些文件被網(wǎng)站用來(lái)在上面存儲(chǔ)Cookie數(shù)據(jù)。
網(wǎng)站可以在這些Cookie 文件中插入信息,這樣對(duì)有些網(wǎng)絡(luò)用戶就有些副作用。有些用戶認(rèn)為這造成了對(duì)個(gè)人隱私的侵犯,更糟的是,有些人認(rèn)為Cookie是對(duì)個(gè)人空間的侵占,而且會(huì)對(duì)用戶的計(jì)算機(jī)帶來(lái)安全性的危害。
目前有些Cookie 是臨時(shí)的,另一些則是持續(xù)的。臨時(shí)的Cookie只在瀏覽器上保存一段規(guī)定的時(shí)間,一旦超過(guò)規(guī)定的時(shí)間該Cookie就會(huì)被系統(tǒng)清除。例如在PHP中Cookie被用來(lái)跟蹤用戶進(jìn)程直到用戶離開(kāi)網(wǎng)站。持續(xù)的Cookie則保存在用戶的Cookie文件中,下一次用戶返回時(shí),仍然可以對(duì)它進(jìn)行調(diào)用。
在Cookie文件中保存Cookie,一些用戶會(huì)過(guò)分地認(rèn)為這將帶來(lái)很大的問(wèn)題。主要是有些用戶擔(dān)心Cookie會(huì)跟蹤用戶網(wǎng)上沖浪的習(xí)慣,譬如用戶喜愛(ài)到那些類(lèi)型的站點(diǎn)、愛(ài)從事些什么活動(dòng)等。害怕這種個(gè)人信息一旦落入一些別有用心的家伙手中,那么個(gè)人也就可能成為一大堆廣告垃圾的對(duì)象,甚至遭到意外的損害。不過(guò),這種擔(dān)心壓根兒不會(huì)發(fā)生,因?yàn)榫W(wǎng)站以外的用戶是無(wú)法跨過(guò)網(wǎng)站來(lái)獲得Cookie信息的。所以想以這種目的來(lái)應(yīng)用Cookie是不可能的。不過(guò),由于一些用戶錯(cuò)誤的理解以及“以訛傳訛”,一些瀏覽器開(kāi)發(fā)商別無(wú)選擇,只好作出相識(shí)的響應(yīng)(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie 的選項(xiàng))。
對(duì)Cookie技術(shù)期待了這么久的結(jié)果是,迫使許多瀏覽器開(kāi)發(fā)商在它們的瀏覽器中提供了對(duì)Cookie的靈活性控制功能。例如,目前的兩大主流瀏覽器Netscape Navigator 和 Internet Explorer是這樣處理Cookie的:Netscape Navigator4.0不但可以接受Cookie進(jìn)行警告,而且還可以屏蔽掉Cookie;InternetExplorer3.0也可以屏蔽Cookie,但在Internet Explorer4.0中就只能進(jìn)行接受警告而沒(méi)有提供屏蔽選項(xiàng),不過(guò)在Internet Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能選項(xiàng)。
此外,很多最新的技術(shù)甚至已經(jīng)可以在不能屏蔽Cookie的瀏覽器上進(jìn)行Cookie的屏蔽了。例如,可以通過(guò)將Cookie文件設(shè)置成不同的類(lèi)型來(lái)限制Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的話,肯定會(huì)因此拒絕許多的站點(diǎn)頁(yè)面。因?yàn)楫?dāng)今已經(jīng)有許多Web站點(diǎn)開(kāi)發(fā)人員愛(ài)上了Cookie技術(shù)的強(qiáng)大功能,
例如Session對(duì)象的使用就離不開(kāi)Cookie的支持。
盡管今天仍有一些網(wǎng)絡(luò)用戶對(duì)于Cookie的爭(zhēng)論樂(lè)此不倦,但是對(duì)于絕大多數(shù)的網(wǎng)絡(luò)用戶來(lái)說(shuō)還是傾向于接受Cookie的。因此,我們盡可以放心地使用Cookie技術(shù)來(lái)開(kāi)發(fā)我們的WEB頁(yè)面。
2)Cookie是怎樣工作的?
要了解Cookie,必不可少地要知道它的工作原理。一般來(lái)說(shuō),Cookie通過(guò)HTTP Headers從服務(wù)器端返回到瀏覽器上。首先,服務(wù)器端在響應(yīng)中利用Set-Cookie header來(lái)創(chuàng)建一個(gè)Cookie ,然后,瀏覽器在它的請(qǐng)求中通過(guò)Cookie header包含這個(gè)已經(jīng)創(chuàng)建的Cookie,并且反它返回至服務(wù)器,從而完成瀏覽器的論證。
例如,我們創(chuàng)建了一個(gè)名字為login的Cookie來(lái)包含訪問(wèn)者的信息,創(chuàng)建Cookie時(shí),服務(wù)器端的Header 如下面所示,這里假設(shè)訪問(wèn)者的注冊(cè)名是“Michael Jordan”,同時(shí)還對(duì)所創(chuàng)建的Cookie的屬性如path、domain、expires等進(jìn)行了指定。
Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT
上面這個(gè)Header會(huì)自動(dòng)在瀏覽器端計(jì)算機(jī)的Cookie文件中添加一條記錄。瀏覽器將變量名為“l(fā)ogin”的Cookie賦值為“Michael Jordon”。注意,在實(shí)際傳遞過(guò)程中這個(gè)Cookie的值是經(jīng)過(guò)了URLEncode方法的URL編碼操作的。 這個(gè)含有Cookie值的HTTP Header被保存到瀏覽器的Cookie文件后,Header就通知瀏覽器將Cookie通過(guò)請(qǐng)求以忽略路徑的方式返回到服務(wù)器,完成瀏覽器的認(rèn)證操作。
此外,我們使用了Cookie的一些屬性來(lái)限定該Cookie的使用。例如Domain屬性能夠在瀏覽器端對(duì)Cookie發(fā)送進(jìn)行限定,具體到上面的例子,該Cookie只能傳達(dá)室到指定的服務(wù)器上,而決不會(huì)跑到其他的如www.hp.com的Web站點(diǎn)上去。Expires屬性則指定了該Cookie保存的時(shí)間期限,例如上面的Cookie在瀏覽器上只保存到1999年3月1日1秒。當(dāng)然,如果瀏覽器上Cookie 太多,超過(guò)了系統(tǒng)所允許的范圍,瀏覽器將自動(dòng)對(duì)它進(jìn)行刪除。至于屬性Path,用來(lái)指定Cookie將被發(fā)送到服務(wù)器的哪一個(gè)目錄路徑下。
說(shuō)明:瀏覽器創(chuàng)建了一個(gè)Cookie后,對(duì)于每一個(gè)針對(duì)該網(wǎng)站的請(qǐng)求,都會(huì)在Header中帶著這個(gè)Cookie;
不過(guò),對(duì)于其他網(wǎng)站的請(qǐng)求Cookie是絕對(duì)不會(huì)跟著發(fā)送的。而且瀏覽器會(huì)這樣一直發(fā)送,直到Cookie過(guò)期為止。
上一部分講了有關(guān)Cookie的技術(shù)背景,這部分來(lái)說(shuō)說(shuō)在PHP里如何設(shè)置、使用、刪除Cookie,及Cookie的一些限制。PHP對(duì)Cookie支持是透明的,用起來(lái)非常方便。
1、設(shè)置Cookie
PHP用SetCookie函數(shù)來(lái)設(shè)置Cookie。必須注意的一點(diǎn)是:Cookie是HTTP協(xié)議頭的一部分,用于瀏覽器和服務(wù)器之間傳遞信息,所以必須在任何屬于HTML文件本身的內(nèi)容輸出之前調(diào)用Cookie函數(shù)。SetCookie 函數(shù)定義了一個(gè)Cookie,并且把它附加在HTTP頭的后面,SetCookie函數(shù)的原型如下:
int SetCookie(string name, string value, int expire, string path, string domain, int secure);
除了name之外所有的參數(shù)都是可選的。value,path,domain 三個(gè)參數(shù)可以用空字符串代換,表示沒(méi)有設(shè)置;expire和 secure兩個(gè)參數(shù)是數(shù)值型的,可以用0表示。expire參數(shù)是一個(gè)標(biāo)準(zhǔn)的Unix時(shí)間標(biāo)記,可以用time()或mktime() 函數(shù)取得,以秒為單位。secure參數(shù)表示這個(gè)Cookie是否通過(guò)加密的HTTPS協(xié)議在網(wǎng)絡(luò)上傳輸。
當(dāng)前設(shè)置的Cookie 不是立即生效的,而是要等到下一個(gè)頁(yè)面時(shí)才能看到.這是由于在設(shè)置的這個(gè)頁(yè)面里Cookie由服務(wù)器傳遞給客戶瀏覽器,在下一個(gè)頁(yè)面瀏覽器才能把Cookie從客戶的機(jī)器里取出傳回服務(wù)器的原因。在同一個(gè)頁(yè)面設(shè)置Cookie,實(shí)際是從后往前,所以如果要在插入一個(gè)新的Cookie之前刪掉一個(gè),你必須先寫(xiě)插入的語(yǔ)句,再寫(xiě)刪除的語(yǔ)句,否則可能會(huì)出現(xiàn)不希望的結(jié)果。 來(lái)看幾個(gè)例子:
簡(jiǎn)單的:
SetCookie("MyCookie", "Value of MyCookie");
帶失效時(shí)間的:
SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小時(shí)
什么都有的:
SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1);
這里還有一點(diǎn)要說(shuō)明的,比如你的站點(diǎn)有幾個(gè)不同的目錄,那么如果只用不帶路徑的Cookie的話,在一個(gè)目錄下的頁(yè)面里設(shè)的Cookie在另一個(gè)目錄的頁(yè)面里是看不到的,也就是說(shuō),Cookie是面向路徑的。實(shí)際上,即使沒(méi)有指定路徑,WEB 服務(wù)器會(huì)自動(dòng)傳遞當(dāng)前的路徑給瀏覽器的,指定路徑會(huì)強(qiáng)制服務(wù)器使用設(shè)置的路徑。
解決這個(gè)問(wèn)題的辦法是在調(diào)用SetCookie時(shí)加上路徑和域名,域名的格式可以是“www.phpuser.com”,也可是“.phpuser.com”。
SetCookie函數(shù)里表示value的部分,在傳遞時(shí)會(huì)自動(dòng)被encode,也就是說(shuō),如果value的值是“test value”在傳遞時(shí)就變成了“test%20value”,跟URL的方法一樣。當(dāng)然,對(duì)于程序來(lái)說(shuō)這是透明的,因?yàn)樵赑HP接收Cookie的值時(shí)會(huì)自動(dòng)將其decode。
如果要設(shè)置同名的多個(gè)Cookie,要用數(shù)組,方法是:
SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[]", "Value 2");
或
SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");
2、接收和處理Cookie
PHP對(duì)Cookie的接收和處理的支持非常好,是完全自動(dòng)的,跟FORM變量的原則一樣,特別簡(jiǎn)單。比如設(shè)置一個(gè)名為MyCookier的Cookie,PHP會(huì)自動(dòng)從WEB服務(wù)器接收的HTTP頭里把它分析出來(lái),并形成一個(gè)與普通變量一樣的變量,名為$myCookie,這個(gè)變量的值就是Cookie的值。數(shù)組同樣適用。另外一個(gè)辦法是引用PHP的全局變量$HTTP_COOKIE_VARS數(shù)組。
分別舉例如下:(假設(shè)這些都在以前的頁(yè)面里設(shè)置過(guò)了,并且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"];
就這么簡(jiǎn)單。
3、刪除Cookie
要?jiǎng)h除一個(gè)已經(jīng)存在的Cookie,有兩個(gè)辦法:
一是調(diào)用只帶有name參數(shù)的SetCookie,那么名為這個(gè)name的Cookie 將被從關(guān)系戶機(jī)上刪掉;另一個(gè)辦法是設(shè)置Cookie的失效時(shí)間為time()或time()-1,那么這個(gè)Cookie在這個(gè)頁(yè)面的瀏覽完之后就被刪除了(其實(shí)是失效了)。
要注意的是,當(dāng)一個(gè)Cookie被刪除時(shí),它的值在當(dāng)前頁(yè)在仍然有效的。
4、使用Cookie的限制
首先是必須在HTML文件的內(nèi)容輸出之前設(shè)置;
其次不同的瀏覽器對(duì)Cookie的處理不一致,且有時(shí)會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。比如:MS IE+SERVICE PACK 1不能正確處理帶域名和路徑的Cookie ,Netscape Communicator 4.05和MS IE 3.0不能正確處理不帶路徑和時(shí)間的Cookie。至于MS IE 5 好象不能處理帶域名、路徑和時(shí)間的Cookie。這是我在設(shè)計(jì)本站的頁(yè)面時(shí)發(fā)現(xiàn)的。
那么Cookie 技術(shù)究竟怎樣呢?是否真的給網(wǎng)絡(luò)用戶帶來(lái)了個(gè)人隱私的危害呢?還是讓我們看了下面的內(nèi)容,再做回答吧。
(1)Cookie技術(shù)簡(jiǎn)介
在WEB技術(shù)發(fā)展史上,Cookie技術(shù)的出現(xiàn)是一個(gè)重大的變革。最先是Netscape在它的Netscape Navigator瀏覽器中引入了Cookie技術(shù),從那時(shí)起,World Wide Web 協(xié)會(huì)就開(kāi)始支持Cookie標(biāo)準(zhǔn)。以后又經(jīng)過(guò)微軟的大力推廣(因?yàn)槲④浀腎IS Web服務(wù)器所采用的ASP技術(shù)很大程度的使用了Cookie技術(shù)),即在微軟的Internet Explorer瀏覽器中完全支持Cookie技術(shù)。到現(xiàn)在,絕大多數(shù)的瀏覽器都支持Cookie技術(shù),或者至少兼容Cookie技術(shù)的使用。
1)什么是Cookie?
按照Netscape官方文檔中的定義,Cookie是在HTTP協(xié)議下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的 一種方式。Cookie 是由Web服務(wù)器保存在用戶瀏覽器上的小文本文件,它可以包含有關(guān)用戶的信息(如身份識(shí)別號(hào)碼、密碼、用戶在Web站點(diǎn)購(gòu)物的方式或用戶訪問(wèn)該站點(diǎn)的次數(shù))。無(wú)論何時(shí)用戶鏈接到服務(wù)器,Web站點(diǎn)都可以訪問(wèn)Cookie信息。
通俗地講,瀏覽器用一個(gè)或多個(gè)限定的文件來(lái)支持Cookie。這些文件在使用Windows操作系統(tǒng)的機(jī)器上叫做Cookie 文件,在Macintosh機(jī)器上叫做magic Cookie 文件,這些文件被網(wǎng)站用來(lái)在上面存儲(chǔ)Cookie數(shù)據(jù)。
網(wǎng)站可以在這些Cookie 文件中插入信息,這樣對(duì)有些網(wǎng)絡(luò)用戶就有些副作用。有些用戶認(rèn)為這造成了對(duì)個(gè)人隱私的侵犯,更糟的是,有些人認(rèn)為Cookie是對(duì)個(gè)人空間的侵占,而且會(huì)對(duì)用戶的計(jì)算機(jī)帶來(lái)安全性的危害。
目前有些Cookie 是臨時(shí)的,另一些則是持續(xù)的。臨時(shí)的Cookie只在瀏覽器上保存一段規(guī)定的時(shí)間,一旦超過(guò)規(guī)定的時(shí)間該Cookie就會(huì)被系統(tǒng)清除。例如在PHP中Cookie被用來(lái)跟蹤用戶進(jìn)程直到用戶離開(kāi)網(wǎng)站。持續(xù)的Cookie則保存在用戶的Cookie文件中,下一次用戶返回時(shí),仍然可以對(duì)它進(jìn)行調(diào)用。
在Cookie文件中保存Cookie,一些用戶會(huì)過(guò)分地認(rèn)為這將帶來(lái)很大的問(wèn)題。主要是有些用戶擔(dān)心Cookie會(huì)跟蹤用戶網(wǎng)上沖浪的習(xí)慣,譬如用戶喜愛(ài)到那些類(lèi)型的站點(diǎn)、愛(ài)從事些什么活動(dòng)等。害怕這種個(gè)人信息一旦落入一些別有用心的家伙手中,那么個(gè)人也就可能成為一大堆廣告垃圾的對(duì)象,甚至遭到意外的損害。不過(guò),這種擔(dān)心壓根兒不會(huì)發(fā)生,因?yàn)榫W(wǎng)站以外的用戶是無(wú)法跨過(guò)網(wǎng)站來(lái)獲得Cookie信息的。所以想以這種目的來(lái)應(yīng)用Cookie是不可能的。不過(guò),由于一些用戶錯(cuò)誤的理解以及“以訛傳訛”,一些瀏覽器開(kāi)發(fā)商別無(wú)選擇,只好作出相識(shí)的響應(yīng)(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie 的選項(xiàng))。
對(duì)Cookie技術(shù)期待了這么久的結(jié)果是,迫使許多瀏覽器開(kāi)發(fā)商在它們的瀏覽器中提供了對(duì)Cookie的靈活性控制功能。例如,目前的兩大主流瀏覽器Netscape Navigator 和 Internet Explorer是這樣處理Cookie的:Netscape Navigator4.0不但可以接受Cookie進(jìn)行警告,而且還可以屏蔽掉Cookie;InternetExplorer3.0也可以屏蔽Cookie,但在Internet Explorer4.0中就只能進(jìn)行接受警告而沒(méi)有提供屏蔽選項(xiàng),不過(guò)在Internet Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能選項(xiàng)。
此外,很多最新的技術(shù)甚至已經(jīng)可以在不能屏蔽Cookie的瀏覽器上進(jìn)行Cookie的屏蔽了。例如,可以通過(guò)將Cookie文件設(shè)置成不同的類(lèi)型來(lái)限制Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的話,肯定會(huì)因此拒絕許多的站點(diǎn)頁(yè)面。因?yàn)楫?dāng)今已經(jīng)有許多Web站點(diǎn)開(kāi)發(fā)人員愛(ài)上了Cookie技術(shù)的強(qiáng)大功能,
例如Session對(duì)象的使用就離不開(kāi)Cookie的支持。
盡管今天仍有一些網(wǎng)絡(luò)用戶對(duì)于Cookie的爭(zhēng)論樂(lè)此不倦,但是對(duì)于絕大多數(shù)的網(wǎng)絡(luò)用戶來(lái)說(shuō)還是傾向于接受Cookie的。因此,我們盡可以放心地使用Cookie技術(shù)來(lái)開(kāi)發(fā)我們的WEB頁(yè)面。
2)Cookie是怎樣工作的?
要了解Cookie,必不可少地要知道它的工作原理。一般來(lái)說(shuō),Cookie通過(guò)HTTP Headers從服務(wù)器端返回到瀏覽器上。首先,服務(wù)器端在響應(yīng)中利用Set-Cookie header來(lái)創(chuàng)建一個(gè)Cookie ,然后,瀏覽器在它的請(qǐng)求中通過(guò)Cookie header包含這個(gè)已經(jīng)創(chuàng)建的Cookie,并且反它返回至服務(wù)器,從而完成瀏覽器的論證。
例如,我們創(chuàng)建了一個(gè)名字為login的Cookie來(lái)包含訪問(wèn)者的信息,創(chuàng)建Cookie時(shí),服務(wù)器端的Header 如下面所示,這里假設(shè)訪問(wèn)者的注冊(cè)名是“Michael Jordan”,同時(shí)還對(duì)所創(chuàng)建的Cookie的屬性如path、domain、expires等進(jìn)行了指定。
Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT
上面這個(gè)Header會(huì)自動(dòng)在瀏覽器端計(jì)算機(jī)的Cookie文件中添加一條記錄。瀏覽器將變量名為“l(fā)ogin”的Cookie賦值為“Michael Jordon”。注意,在實(shí)際傳遞過(guò)程中這個(gè)Cookie的值是經(jīng)過(guò)了URLEncode方法的URL編碼操作的。 這個(gè)含有Cookie值的HTTP Header被保存到瀏覽器的Cookie文件后,Header就通知瀏覽器將Cookie通過(guò)請(qǐng)求以忽略路徑的方式返回到服務(wù)器,完成瀏覽器的認(rèn)證操作。
此外,我們使用了Cookie的一些屬性來(lái)限定該Cookie的使用。例如Domain屬性能夠在瀏覽器端對(duì)Cookie發(fā)送進(jìn)行限定,具體到上面的例子,該Cookie只能傳達(dá)室到指定的服務(wù)器上,而決不會(huì)跑到其他的如www.hp.com的Web站點(diǎn)上去。Expires屬性則指定了該Cookie保存的時(shí)間期限,例如上面的Cookie在瀏覽器上只保存到1999年3月1日1秒。當(dāng)然,如果瀏覽器上Cookie 太多,超過(guò)了系統(tǒng)所允許的范圍,瀏覽器將自動(dòng)對(duì)它進(jìn)行刪除。至于屬性Path,用來(lái)指定Cookie將被發(fā)送到服務(wù)器的哪一個(gè)目錄路徑下。
說(shuō)明:瀏覽器創(chuàng)建了一個(gè)Cookie后,對(duì)于每一個(gè)針對(duì)該網(wǎng)站的請(qǐng)求,都會(huì)在Header中帶著這個(gè)Cookie;
不過(guò),對(duì)于其他網(wǎng)站的請(qǐng)求Cookie是絕對(duì)不會(huì)跟著發(fā)送的。而且瀏覽器會(huì)這樣一直發(fā)送,直到Cookie過(guò)期為止。
上一部分講了有關(guān)Cookie的技術(shù)背景,這部分來(lái)說(shuō)說(shuō)在PHP里如何設(shè)置、使用、刪除Cookie,及Cookie的一些限制。PHP對(duì)Cookie支持是透明的,用起來(lái)非常方便。
1、設(shè)置Cookie
PHP用SetCookie函數(shù)來(lái)設(shè)置Cookie。必須注意的一點(diǎn)是:Cookie是HTTP協(xié)議頭的一部分,用于瀏覽器和服務(wù)器之間傳遞信息,所以必須在任何屬于HTML文件本身的內(nèi)容輸出之前調(diào)用Cookie函數(shù)。SetCookie 函數(shù)定義了一個(gè)Cookie,并且把它附加在HTTP頭的后面,SetCookie函數(shù)的原型如下:
int SetCookie(string name, string value, int expire, string path, string domain, int secure);
除了name之外所有的參數(shù)都是可選的。value,path,domain 三個(gè)參數(shù)可以用空字符串代換,表示沒(méi)有設(shè)置;expire和 secure兩個(gè)參數(shù)是數(shù)值型的,可以用0表示。expire參數(shù)是一個(gè)標(biāo)準(zhǔn)的Unix時(shí)間標(biāo)記,可以用time()或mktime() 函數(shù)取得,以秒為單位。secure參數(shù)表示這個(gè)Cookie是否通過(guò)加密的HTTPS協(xié)議在網(wǎng)絡(luò)上傳輸。
當(dāng)前設(shè)置的Cookie 不是立即生效的,而是要等到下一個(gè)頁(yè)面時(shí)才能看到.這是由于在設(shè)置的這個(gè)頁(yè)面里Cookie由服務(wù)器傳遞給客戶瀏覽器,在下一個(gè)頁(yè)面瀏覽器才能把Cookie從客戶的機(jī)器里取出傳回服務(wù)器的原因。在同一個(gè)頁(yè)面設(shè)置Cookie,實(shí)際是從后往前,所以如果要在插入一個(gè)新的Cookie之前刪掉一個(gè),你必須先寫(xiě)插入的語(yǔ)句,再寫(xiě)刪除的語(yǔ)句,否則可能會(huì)出現(xiàn)不希望的結(jié)果。 來(lái)看幾個(gè)例子:
簡(jiǎn)單的:
SetCookie("MyCookie", "Value of MyCookie");
帶失效時(shí)間的:
SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小時(shí)
什么都有的:
SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1);
這里還有一點(diǎn)要說(shuō)明的,比如你的站點(diǎn)有幾個(gè)不同的目錄,那么如果只用不帶路徑的Cookie的話,在一個(gè)目錄下的頁(yè)面里設(shè)的Cookie在另一個(gè)目錄的頁(yè)面里是看不到的,也就是說(shuō),Cookie是面向路徑的。實(shí)際上,即使沒(méi)有指定路徑,WEB 服務(wù)器會(huì)自動(dòng)傳遞當(dāng)前的路徑給瀏覽器的,指定路徑會(huì)強(qiáng)制服務(wù)器使用設(shè)置的路徑。
解決這個(gè)問(wèn)題的辦法是在調(diào)用SetCookie時(shí)加上路徑和域名,域名的格式可以是“www.phpuser.com”,也可是“.phpuser.com”。
SetCookie函數(shù)里表示value的部分,在傳遞時(shí)會(huì)自動(dòng)被encode,也就是說(shuō),如果value的值是“test value”在傳遞時(shí)就變成了“test%20value”,跟URL的方法一樣。當(dāng)然,對(duì)于程序來(lái)說(shuō)這是透明的,因?yàn)樵赑HP接收Cookie的值時(shí)會(huì)自動(dòng)將其decode。
如果要設(shè)置同名的多個(gè)Cookie,要用數(shù)組,方法是:
SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[]", "Value 2");
或
SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");
2、接收和處理Cookie
PHP對(duì)Cookie的接收和處理的支持非常好,是完全自動(dòng)的,跟FORM變量的原則一樣,特別簡(jiǎn)單。比如設(shè)置一個(gè)名為MyCookier的Cookie,PHP會(huì)自動(dòng)從WEB服務(wù)器接收的HTTP頭里把它分析出來(lái),并形成一個(gè)與普通變量一樣的變量,名為$myCookie,這個(gè)變量的值就是Cookie的值。數(shù)組同樣適用。另外一個(gè)辦法是引用PHP的全局變量$HTTP_COOKIE_VARS數(shù)組。
分別舉例如下:(假設(shè)這些都在以前的頁(yè)面里設(shè)置過(guò)了,并且仍然有效)
echo $MyCookie;
echo $CookieArray[0];
echo count($CookieArray);
echo $HTTP_COOKIE_VARS["MyCookie"];
就這么簡(jiǎn)單。
3、刪除Cookie
要?jiǎng)h除一個(gè)已經(jīng)存在的Cookie,有兩個(gè)辦法:
一是調(diào)用只帶有name參數(shù)的SetCookie,那么名為這個(gè)name的Cookie 將被從關(guān)系戶機(jī)上刪掉;另一個(gè)辦法是設(shè)置Cookie的失效時(shí)間為time()或time()-1,那么這個(gè)Cookie在這個(gè)頁(yè)面的瀏覽完之后就被刪除了(其實(shí)是失效了)。
要注意的是,當(dāng)一個(gè)Cookie被刪除時(shí),它的值在當(dāng)前頁(yè)在仍然有效的。
4、使用Cookie的限制
首先是必須在HTML文件的內(nèi)容輸出之前設(shè)置;
其次不同的瀏覽器對(duì)Cookie的處理不一致,且有時(shí)會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。比如:MS IE+SERVICE PACK 1不能正確處理帶域名和路徑的Cookie ,Netscape Communicator 4.05和MS IE 3.0不能正確處理不帶路徑和時(shí)間的Cookie。至于MS IE 5 好象不能處理帶域名、路徑和時(shí)間的Cookie。這是我在設(shè)計(jì)本站的頁(yè)面時(shí)發(fā)現(xiàn)的。
第三個(gè)限制是在客戶端的。一個(gè)瀏覽器能創(chuàng)建的Cookie數(shù)量最多為30個(gè),并且每個(gè)不能超過(guò)4KB,每個(gè)WEB站點(diǎn)能設(shè)置的Cookie總數(shù)不能超過(guò)20個(gè)。
關(guān)鍵字:客戶端、Cookie、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解