Delphi 3中Cookie的建立使用: |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 Delphi 3中Cookie的建立使用:
Cookies是一種Web伺服器在用戶端存儲和返回資訊的機制,這種簡單的、永久的和基於用戶端的狀態資訊大大的擴充了基於Web的客戶/伺服器(Client/Server)應用程式的能力。因此廣泛應用在大量的實際中,例如所有訂閱Microsoft公司的MSDN的用戶、訪問過Borland Online的用戶,以及訪問過我的主頁(http://www.nease.net/~borland)的用戶都會在本地存儲Cookie,以便下次訪問時提供上次訪問的記錄。 Delphi 3是Borland公司1997年推出的視覺化、面向物件的高效率的快速應用程式開發工具(RAD),提供了大量的最新功能,例如開發COM/DCOM,一步開發ActiveX物件,多層資料庫應用程式MIDAS等,並且使用Delphi 3開發基於Web伺服器的程式,如ISAPI/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文件發現在中文Windows 95和NT環境下該程式有錯誤。 根據Netscape公司的規定,Cookie的格式應?:
Set-Cookie: Name=Value; expires=DATA; Path=PATH; domain=DOMAIN_NAME; secure
而且根據規定,日期(DATA)的設置必須滿足格式“Wdy, DD-Mon-YYYY HH:MM:SS GMT”,基於RFC822, 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;
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |