top
Loading...
在CGI中如何使用cookie
cookie概述:
在http協議一個很大的缺點就是不作用戶身份的判斷,這樣給編程人員帶來很大的不便,
而cookie功能的出現彌補了這個缺憾。
所有cookie就是在客戶訪問腳本的同時,通過客戶的瀏覽器,在客戶硬盤上寫入紀錄數據
,當下次客戶訪問腳本時取回數據信息,從而達到身份判別的功能,cookie常用在密碼判斷中

cookie的語法:
http cookie的發送是通過http頭部來實現的,他早于文件的傳遞,頭部set-cookie的語法如下:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
name=name: 需要設置cookie的值(name不能使用“;”和","號),有多個name值時用";"分隔例如:name1=name1;name2=name2;name3=name3。

expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"

path=path: 設置cookie支持的路徑,如果path是一個路徑,則cookie對這個目錄下的所有文件及子目錄生效,例如: path="/cgi-bin/",如果path是一個文件,則cookie指對這個文件生效,例如:path="/cgi-bin/cookie.cgi"。

domain=domain: 對cookie生效的域名,例如:domain="www.chinalb.com"

secure: 如果給出此標志,表示cookie只能通過SSL協議的https服務器來傳遞。


cookie的接收是通過設置環境變量HTTP_COOKIE來實現的,CGI程序可以通過檢索該變量獲取cookie信息。

cookie的模塊:
以下是一個cookie的模塊,可以為你編寫程序帶來方便
#########代碼開始
###############################################################################
# HTTP Cookie Library Version 2.1 #
# Copyright 1996 Matt Wright mattw@worldwidemart.com #
# Created 07/14/96 Last Modified 12/23/96 #
###############################################################################
$Cookie_Exp_Date = 'Thu, 31-Dec-2050 23:00:00 GMT'; #此處設置cookie的有效時間
$Cookie_Path = ''; #此處設置cookie的有效路徑,默認腳本存在的目錄。
$Cookie_Domain=''; #此處設置cookie的有效域名,默認腳本調用的域名。

@Cookie_Encode_Chars = ('%', '+', ';', ',', '=', '&', '::', 's');
%Cookie_Encode_Chars = ('%', '%25',
'+', '%2B',
';', '%3B',
',', '%2C',
'=', '%3D',
'&', '%26',
'::', '%3A%3A',
's', '+'); # 特殊字符的解碼

@Cookie_Decode_Chars = ('+', '%3A%3A', '%26', '%3D', '%2C', '%3B', '%2B', '%25');
%Cookie_Decode_Chars = ('+', ' ',
'%3A%3A', '::',
'%26', '&',
'%3D', '=',
'%2C', ',',
'%3B', ';',
'%2B', '+',
'%25', '%'); # 特殊字符的解碼
###################################3

#獲取cookie信息

###############################################################################
# GetCookies #
###############################################################################
sub GetCookies {
local(@ReturnCookies) = @_;
local($cookie_flag) = 0;
local($cookie,$value);
if ($ENV{'HTTP_COOKIE'}) {
foreach (split(/; /,$ENV{'HTTP_COOKIE'})) { #分割HTTP_COOKIE變量的字符串
($cookie,$value) = split(/=/);
foreach $char (@Cookie_Decode_Chars) {
$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g; #調用轉碼函數
$value =~ s/$char/$Cookie_Decode_Chars{$char}/g; #調用轉碼函數
}
$Cookies{$cookie} = $value;
}
$cookie_flag = 1;
}
return $cookie_flag;
}


# 設置Cookie信息
###############################################################################
# SetCookies #
###############################################################################
sub SetCookies {
if ($HeaderDefine ne "TRUE") {
print "Content-type: text/htmln"; # 瀏覽器頭部信息開始
local(@cookies) = @_;
local($cookie,$value,$char);

while( ($cookie,$value) = @cookies ) {
foreach $char (@Cookie_Encode_Chars) {
$cookie =~ s/$char/$Cookie_Encode_Chars{$char}/g; #調用轉碼函數
$value =~ s/$char/$Cookie_Encode_Chars{$char}/g; #調用轉碼函數
}
print 'Set-Cookie: ' . $cookie . '=' . $value . ';'; #設置cookie值
if ($Cookie_Exp_Date) {
print ' expires=' . $Cookie_Exp_Date . ';'; #設置有效時間
}
if ($Cookie_Path) {
print ' path=' . $Cookie_Path . ';'; #設置有效路徑
}

if ($Cookie_Domain){
print ' domain=' . $Cookie_Domain . ';'; #設置有效域名
}
print "n"; #瀏覽器頭部信息結束
shift(@cookies); shift(@cookies);
}
$HeaderDefine = "TRUE";
}
}

1; #return true

##########代碼結束

模塊的調用方法:

設置cookie:
&SetCookies('NAME', $name, 'PASS', $pass); #設置NAME 和PASS兩個cookie值.

取cookie:

&GetCookies;
$name=$Cookies{'NAME'};
$pass=$Cookies{'PASS'};


Cookie使用的注意事項:
發送cookie時由于是通過http頭發送的,而http頭部只能發送一次,因此在使用cookie模
快時不能再使用 print "Content-type: text/htmlnn";的頭部輸出語句,否則程序會報錯
北斗有巢氏 有巢氏北斗