HTTP協議是非常強大的。不過,它有一個缺陷就是不記憶狀態。這意味著,當一次HTTP會話結束後,不管是客戶還是服務器,都不記憶剛剛發生的會話。這有可能導致一些麻煩,因為服務器無法知道一些重要的事情,諸如口令、發給客戶的紀錄等。 HTTP協議提供了一個基本方法可以讓客戶的機器中保存一些信息,這樣,服務器就可以從中知道上一次HTTP會話的的情況,這就是所謂的Cookie。 Cookie實際是一個字符串,它的格式是 CookieName=CookieValue。Cookie中不應該有分號或逗號。客戶可以拒絕Cookie,所以任何一個Web應用程序不能認為客戶的機器肯定有Cookie。察看Cookie的情況可以在WindowsCookies中找。 在Delphi中管理Cookie是一件非常容易的事。THTTPRequest和THTTPResponse都封裝了用來處理Cookie的特性和方法,允許您控制怎樣讀寫Cookie。 要設置Cookie的內容,您可以調用TWebResponse的SetCookieField的方法。這個方法需要傳遞一個TStrings對象作為Cookie的內容以及這個Cookie的限制條件。SetCookieField()方法是這樣聲明的: procedure SetCookieField(Values:TStrings;const ADomain,APath:string;AExpires:TDateTime;ASecure:Boolean);Values參數是一個TStrings對象(也可以使用TStringList對象),用於指定Cookie的實際內容。Values中可以包含多個Cookie。ADomain 參數用於限制服務器的域,Cookie只對特定域的服務器是有效的。如果這個參數為空,Cookie將被傳遞給任何一個服務器。一般情況下,應當把這個參數設為Web服務器的域名。APath參數用於指定一組路徑,Cookie只在特定的路徑下是合法的。AExpires參數用於指定Cookie在多長時間內是合法的,由於時差的原因,這個時間應當基於GMT時區。如果您想使Cookie的有效時間是10天,就應當把這個參數設為Now+10。如果要使一個Cookie無效,這個參數可以設為過去的一個時間。注意,一個Cookie無效後,就不會被傳遞給服務器,但並不從客戶機中刪除。ASecure參數是一個boolean值,如果這個參數設為True,表示Cookie只能通過HTTP或SSL傳遞。一般情況,這個參數設為False。 在Web服務器端,您可以通過TWebRequest的CookieFields特性訪問由客戶傳遞來的Cookie。這個特性是一個TStrings對象,每個Cookie的格式是param=value。調用TWebRequest的ExtractCookieFields()方法可以把多個Cookie分解為一個個字符串。 Cookie可以保存任何字符串所能表達的信息。Cookie的長度最多可達4KB,客戶的機器最多可以保存300個Cookie.每個服務器或域的Cookie不超過20個。下面舉一個例子說明Cookie的應用:var
CookList : TStringList;
iBZ,fcbz:integer; begin
CookList := TStringList.Create;
try
CookList.Add(NSRID=+ sNSRID);
CookList.Add(NSRMC= + sNSRMC);
CookList.Add(WJBM= + sWJBM);
CookList.Add(YHZH= + sYHZH);
iBZ:=0;
fcbz:=0;
CookList.Add(BZ= + IntToStr(iBZ));
CookList.Add(FCBZ= + IntToStr(fcbz));
Response.SetCookieField(cookList,,,Now+10,False);
finally
cookList.Free;
End;
End;//創建Cookie iBZ:=StrToInt(Request.CookieFields.Values[BZ]);//使用Cookie