關(guān)于CGI讀寫COOKIE的編程
發(fā)布時(shí)間:2008-10-17 閱讀數(shù): 次 來源:網(wǎng)樂原科技
COOKIE的用途相信大家都知道了,有時(shí)我們的CGI需要記錄讀取某個(gè)來訪者的信息,例如該來訪者使用該CGI的情況,那就得用到COOIKE技術(shù),下面就討論一下如何用CGI來記錄、讀取來訪者計(jì)算機(jī)中的COOKIE。
COOKIE在不同的瀏覽器上的存儲(chǔ)方式是不同的,但這并不存在不兼容的問題,因?yàn)閃EB服務(wù)器與瀏覽器之間是通過HTTP響應(yīng)頭實(shí)現(xiàn)互相傳送COOKIE的信息的,我們?cè)谧x寫COOKIE時(shí)不必理會(huì)其在客戶端是怎么存儲(chǔ)的。
在CGI向來訪者的計(jì)算機(jī)中寫入一條COOKIE時(shí),CGI需要向?yàn)g覽器發(fā)送一個(gè)響應(yīng)頭:
Set-Cookie:name1=value;name2=value2;exprires=DATE;PATH=PATH;domiam=DOMAIN_NAME;SECURE
現(xiàn)在逐個(gè)來解釋以上響應(yīng)頭各項(xiàng)的含義,各項(xiàng)內(nèi)容是用分號(hào)閣開的
我們看到 name1=value和name2=value2 就是你要設(shè)置的COOKIE的內(nèi)容,它是以名字=值的方式發(fā)送的,而name=value中不可以有冒號(hào)、逗號(hào)、和空格,但可以用%XX代替,XX為一個(gè)16進(jìn)制數(shù);
exprires=DATE項(xiàng)是有關(guān)COOKIES的生存期,即該COOKIE的有效期,有效期的時(shí)間格式是格林威治時(shí)間格式:wdy,DD-MON-YYYY HH:MM:SS GMT
這一項(xiàng)在寫入COOIE時(shí)是可選的,但不設(shè)置的話瀏覽器與WEB服務(wù)器的一次連接結(jié)束后,COOKIE就過了有效期;
domian項(xiàng)定義哪些主機(jī)可以讀取COOKIES,通常COOKIE存放的都不重要的信息,如果你要存放的的信息不大重要,這一項(xiàng)也不用設(shè)置;
PATH項(xiàng)是定義了一臺(tái)主機(jī)上哪些WWW資源可以讀取你所設(shè)置的COOKIE,如果PATH=/ 則這臺(tái)主機(jī)上所有WWW資源可以讀取你所設(shè)置的COOKIE;
SECURE是有關(guān)加密傳送我們可不用理會(huì)。
如果你在一臺(tái)支持COOKIE的客戶端設(shè)置了COOKIE,當(dāng)這個(gè)客戶端在次來訪問時(shí),瀏覽器會(huì)向你的CGI所在的WEB服務(wù)器發(fā)送一條HTTP響應(yīng)頭,這個(gè)響應(yīng)頭為:
Cookie:name1=value;name2=value2;exprires=DATE;PATH=PATH;domiam=DOMAIN_NAME;SECURE
根據(jù)這個(gè)HTTP響應(yīng)頭WEB服務(wù)器的環(huán)境變量 HTTP_COOKIE=:name1=value;name2=value2
我們對(duì)這個(gè)環(huán)境變量的內(nèi)容進(jìn)行分解就可以的到我我們要的信息。
以下給出我寫的讀寫COOKIE的兩段PERL程序,你也可以把它改寫為C語言
設(shè)置COOKIE:
print "Content-type:text/htmln";
print "Set-Cookie:name1=zjxyz;expires=Thursdday,01-Jan-2000 12:00:00 GMTn";
print "Set-Cookie:name2=ken;expires=Thursdday,01-Jan-2000 12:00:00 GMTn";
print "Set-Cookie:name3=ken;expires=Thursdday,01-Jan-2000 12:00:00 GMTnn";
讀取COOKIE和分解的過程:
@pairs = split(/&/, $ENV{'HTTP_COOKIE'});
foreach $pair (@pairs){
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$cookie{$name} = $value;}