Cookie的建立使用 (轉)

gugu99發表於2007-10-14
Cookie的建立使用 (轉)[@more@]

 

Cookie的建立使用

是一種在客戶端和返回資訊的機制

這種簡單的、永久的和基於客戶端的狀態信

息大大的擴充了基於Web的客戶/伺服器(Client/Server)應用的能力。因此廣泛應用在大量的實際中,

例如所有訂閱公司的MSDN的、訪問過Borland Online的使用者,以及訪問過的主頁本地儲存

Cookie,以便下次訪問時提供上次訪問的記錄。

3是Borland公司1997年推出的視覺化、面向的高的應用程式開發工具(RAD),提供

了大量的最新功能,例如開發COM/DCOM,一步開發物件,多層應用程式MIDAS等,並且使用

Delphi 3開發基於Web伺服器的程式,如IS/NSAPI ,Win-CGI,CGI程式都十分方便。

使用Delphi 3開發Web Server程式是非常簡單,方便的,因為在Delphi中提供了Web Module、

TWebApplication、TWebRequest、TWebResponse、TPageProducer等大量的物件供使用.對於

Cookie

Delphi3也提供了大量的程式供使用

如TWebResponse.Cookies,TWebResponse.SetCookieField

,TWebRequest.Cookie,TWebRequest.CookieFields,TWebRequest.ExtractCookieFields等,應該是

非常方便。但本人為了實現一功能需要設定Cookie,但是發現使用Delphi提供的SetCookieFields設定不

成功,經研究Delphi 3所帶的HttpApp.Pas和IsapiApp.Pas發現在中文 95和NT環境下該程式

有錯誤。 根據scape公司的規定

Cookie的格式應為: Set-Cookie: Name=Value; expires=DATA;

Path=PATH; ain=DOMAIN_NAME; secure而且根據規定

日期(DATA)的設定必須滿足格式“Wdy

DD-Mon-YYYY HH:MM:SS GMT”

基於822

RFC850

RFC1036和RFC1123等規定,但是檢查

HTTPAPP.PAS中的function TCookie.GetHeaderValue: string中為FormatDateTime('"expires="' +

DateFormat + ' "GMT; "'

Expires);

其中const DateFormat = 'ddd

dd mmm yyyy hh:mm:ss'

程式在英文環境中產生的格式是正確的

但是在中文中產生的結果卻不對

因為星期和月份都將按照中文的表

示方法:如將11月生產“十一月”中文串,這樣在Netscape Navigator和Microsoft Internet Explorer

就不能辨認了。

既然錯誤在於原VCL未考慮中文環境的問題,所以修改的方法有:1、修改VCL源程式

編譯後將dcu檔案拷

貝到Lib目錄,這樣會完全改正錯誤,這樣是最根本的解決方法,但是 如果將源程式放在另一未修改的

Delphi中(例如提供源程式給別人和自己重新)編譯又將出現問題。2、因為使用並不太多,所以可以將

修改的程式放在自己的程式中,使用 Delphi 3 提供的TWebResponse.SetCustomHeader設定

這樣的好處

是將程式放在自己的程式內,重新裝Delphi或在另一臺上編譯的結果也會完全正確。因為Cookie的

目的一般有兩種, 一種是在此會話過程中使用,過後不使用,此時不需要Expires段,不會產生時間錯誤,

可以使用Delphi 3提供的所有Cookie程式;另一種為永久儲存,時間一般越長越好,於是可以將時間設定

為2099年二月22日

於是程式中設定Cookie的方法為

:Response.SetCustomHeader('Set-Cookie'

'Name=Value; expires=Sun

22 Feb 2099 08:08:08

GMT'); (注斜體用自己的名稱代替,例如設定Count=10,則Name用Count代替,Value 用10代替),這樣

就可以建立Cookie了.

以下為建立一個訪問計數器的程式,可以參照:

const

LastIp:String='0:0:0:0'; //避免重複計數

Var

S:String;

Count:Integer;

begin

S:=Request.CookieFields.Values['count'];

if S<>'' then begin

try

Count:=StrToInt(S);

Except

Count:=0;

End;

end else Count:=0;

if LastIp<>Request.RemoteAddr then Inc(Count);

LastIp:=Request.RemoteAddr;

Response.SetCustomHeader('Set-Cookie'

'count='+IntToStr(Count)+';

expires=Sun

21 Feb 2010

08:08:08 GMT');

Response.Content:='您是第'+IntToStr(Count)+'來到本頁!';

End;

(以上程式用Win95B的個人Web伺服器+Netscape Navigator 4.04透過)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-976379/,如需轉載,請註明出處,否則將追究法律責任。

相關文章