[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 其它 > 正文
CGI編程的COOKIE技術應用
本文出自:http://gzdzw.51.net 作者: 思維 (2001-08-24 07:00:00)
    我們在一些留言本、BBS討論區發貼時常會出現這種現象:當進入發貼界面時在要求填寫用戶名和密碼的地方就已經自動地填上了你的資料。這是什會事呢?這是因為程序中引入了COOKIE技術的緣故。原來在你第一次登錄時,程序就已在你的電腦中安裝了一個COOKIE信息包,在你今登陸時電腦就自動檢索你的COOKIE並取出信息包的信息供程序調用,所以出現上面所述的現象。
COOKIE只不過是CGI程序要求瀏覽器持有的一個信息包,這個信息包可以由CGI程序在任何時候收回。每當CGI程序要求創建COOKIE時,COOKIE可以從服務器傳送到瀏覽器所屬的子目錄下(通常是保存在C:\WINDOWS\Temporary Internet Files的目錄下,這個過程稱為COOKIE的安裝。
    COOKIE的安裝和讀出通常都由一個CGI模塊來完成,下面我就將此模塊的原代碼公布給大家,有了這個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="gzdzw.51.net"
secure: 如果給出此標志,表示cookie只能通過SSL協議的https服務器來傳遞。
cookie的接收是通過設置環境變量HTTP_COOKIE來實現的,CGI程序可以通過檢索該變量獲取cookie信息。 
以下是一個cookie的模塊,可以為你編寫程序帶來方便 
$Cookie_Exp_Date = '';#此處設置cookie的有效時間
$Cookie_Path = '';#此處設置cookie的有效路徑,默認腳本存在的目錄。
$Cookie_Domain = ''; #此處設置cookie的有效域名,默認腳本調用的域名。
$Secure_Cookie = '0';
@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', '%');# 特殊字符的解碼
#########獲取cookie信息子程序#####################
sub GetCookies {
local(@ReturnCookies) = @_;
local($cookie_flag) = 0;
local($cookie,$value);
if ($ENV{'HTTP_COOKIE'}) {
if ($ReturnCookies[0] ne '') {
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;#調用轉碼函數
}
foreach $ReturnCookie (@ReturnCookies) {
if ($ReturnCookie eq $cookie) {
$Cookies{$cookie} = $value;
$cookie_flag = "1";
}
}
}
}
else {
foreach (split(/; /,$ENV{'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信息子程序#######################
sub SetSecureCookie {
if ($_[0] =~ /^[01]$/) {
$Secure_Cookie = $_[0];
return 1;
}
else {
return 0;
}
}
sub SetCookies {
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 . ';'; }#設置有效域名
if ($Secure_Cookie) { print ' secure'; }
print "\n";
shift(@cookies); shift(@cookies);
}
}
sub SetCompressedCookies {
local($cookie_name,@cookies) = @_;
local($cookie,$value,$cookie_value);
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;
}
if ($cookie_value) { $cookie_value .= '&' . $cookie . '::' . $value; }
else { $cookie_value = $cookie . '::' . $value; }
shift(@cookies); shift(@cookies);
}
&SetCookies("$cookie_name","$cookie_value");
}
sub GetCompressedCookies {
local($cookie_name,@ReturnCookies) = @_;
local($cookie_flag) = 0;
local($ReturnCookie,$cookie,$value);
if (&GetCookies($cookie_name)) {
if ($ReturnCookies[0] ne '') {
foreach (split(/&/,$Cookies{$cookie_name})) {
($cookie,$value) = split(/::/);
foreach $char (@Cookie_Decode_Chars) {
$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;
$value =~ s/$char/$Cookie_Decode_Chars{$char}/g;
}
foreach $ReturnCookie (@ReturnCookies) {
if ($ReturnCookie eq $cookie) {
$Cookies{$cookie} = $value;
$cookie_flag = 1;
}
}
}
}
else {
foreach (split(/&/,$Cookies{$cookie_name})) {
($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;
}
delete($Cookies{$cookie_name});
}
return $cookie_flag;
}
########結束#################
下面是cookie信息包安裝代碼段
<SCRIPT LANGUAGE="JavaScript">
<!-- HIDE
expireDate = new Date;
if (expireDate.getYear() < 100) {
expireDate.setYear(expireDate.getYear() + 1900 + 1);
} else {
expireDate.setYear(expireDate.getYear()+1);
}
var username = getCookie("UserName");
var password = getCookie("Password");
if (password == null) {
var CookieName = "$username";
var CookiePW = "$userpsd";
if (password == null) {
document.cookie = "username=" + CookieName + ";expires=" + expireDate.toGMTString() + ";";
document.cookie = "password=" + CookiePW + ";expires=" + expireDate.toGMTString() + ";";
}
}
function getCookie(name){
var cname = name + "=";
var dc = document.cookie;
if (dc.length > 0) {
begin = dc.indexOf(cname);
if (begin != -1) {
begin += cname.length;
end = dc.indexOf(";", begin);
if (end == -1) end = dc.length;
return dc.substring(begin, end); }
}
return null;
}
// STOP HIDING FROM OTHER BROWSERS -->
</SCRIPT>
###########結束#####################
下面是讀取信息包代碼,很簡單:

&GetCookies;
$name=$Cookies{'username'};
$pass=$Cookies{'password'};


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
CGI編程的COOKIE技術應用 (2001-08-24 07:00:00)
cookie模組 (2001-06-03 11:00:00)
 

★  樊強制作 歡迎分享  ★