|
[作者:扬州BCB]
1 G$ Q: ]: F4 e( M7 R$ s 一、 Cookie概述: 8 H3 ~0 i6 i' V
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。8 p/ M! I0 t) Z, ^" x( @7 ~! e
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机' `$ `* J2 J1 @( W! l n
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可6 ~ A5 @! Q' B8 X9 A& K; z
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量% n1 W% `; \4 L9 ]: Z4 {
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次9 W) h" }7 E0 y0 R& @9 B" h
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
, a) J3 u6 [- Y. q2 \页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
# u( j& q: D$ _* f2 \' Q2 u' K小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,; L/ ?& v, j8 e9 N' j
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; . i1 e; L! ~. n6 S; z
二、JavaScript脚本对Cookie变量的存取:. s6 q6 } \4 B# _) ~
JavaScript是运行在客户端的脚本程序,用它可将文本输入
6 {: w0 s3 h& N( ^框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍9 H9 G. R; i( x) d
微减轻Web服务器的一点负担: 4 {, s7 C/ L; s% z& {% E; F* B
1>读出Cookie: Q- l i0 n4 H; [& Q
JavaScript中可通过document.cookie访问到所有Cookie:
8 l" _$ c- h3 C. M5 y- y/ L "变量1=值1;变量2=值2;变量3=值3;"
& ` X9 p+ x: L2 v @3 N5 l 需经过串分解就可得到每一个变量名及值;" O6 n. a% n- Y
2>写Cookie:
$ ~( {' y' k+ S. S email="bush@usa.com";
8 D0 \& K# ?& u \, @ firstname="jorge";( N# s# B8 |/ g' r2 ?# E7 Z
lastname="bush";+ z& d3 E( y8 U" s' P* e
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";7 Y% J9 ^; B' t& W
document.cookie="email="+email+";expires="+expireDate;
. p5 K# [- a9 o! C document.cookie="firstname="+firstname+";expires="+expireDate;
5 m/ I$ M* u d/ T" {* C: p7 x document.cookie="lastname="+lastname+";expires="+expireDate; . [( V; ~% |1 ^# E
下页一例,将网页的文本输入框域变量NAME自动保存下来: " ?) Q1 C& V; l3 a9 G+ U' V
<script language="JavaScript">
4 Z5 r. x3 }% r1 s: {$ q<!--# Q% x- x' m) c) m8 Q- W
function getValue(s,n) // 分解Cookie表达式s, K* J9 _6 Q$ k. i0 d
{
$ e# W0 w1 j) r6 C' r var pairs=s.split(";"); // 分解成串数组
* g [; _! A# G" T3 o; q for (var i=0;i<pairs.length;i++)
b5 ?6 T& t u7 q3 E9 u/ q {
9 d; c8 P( a2 }7 J var pairSplit=pairs.split("=");* l! a: ]5 n; \7 Q" Z
if (pairSplit[0]==n) file://查找n
' m( O0 ^" F" ` return pairSplit[1]; file://取到n的值
) Y6 c3 {, \' h, ~$ d' P } - Q* {+ e8 @% z. f; ]
return "";
/ `3 j' z2 }5 I( D! O4 M! ~}
6 D% t( X+ S* z6 t( Dfunction getName() file://取Cookie中的姓名NAME
, |4 u& C+ N2 H9 \+ B{, a+ }* x( c3 `) h
var s=document.cookie; // 取所保存的Cookie2 r( d( w4 A" d9 `
NAME0=getValue(s,"NAME");
+ H/ ^) @' t% u& |! q& Q% z form1.NAME.value=NAME0;7 F, P3 i, a8 v5 e- {2 \" \5 q2 ~
}
: \; W7 g' B, y, P+ vfunction newCookie() file://将Cookie中存姓名( F- V3 S! u; J- a
{
9 u+ T' }, C( t5 ^2 Q$ ~ var s=form1.NAME.value;' w+ ^& q+ `8 i1 i% ^. M; R
if (s!="" && s!=NAME0) // 非空则保存
0 r a; Z) ]3 u& K. W {: f8 {/ J5 J1 C! ~
s="NAME="+s;
; Z# E4 F B; R0 I! P1 @: v s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";: C! c6 F, ^# T# a
document.cookie=s; // 将保存到客户机中
. R" r' l9 R+ k; A/ ?! A' R, ^ }
5 j7 D+ o, A; q8 c \}7 S- }: R9 g5 H+ P' x
file://--></script>
8 `1 R t" |7 f& _( j..................
; n( s( U5 I& b<body bgcolor="#00FFFF" onload="getName();0 x! [ t. I1 R" P5 c
form1.TEXT.focus()" onunload="newCookie()">( v$ `4 _7 {5 G6 P: v; {+ X
<!进入本网页时将执行onload中的getName()>
4 c+ K! X) }1 K$ Z/ x2 S' q1 t<!退出本网页时将执行onunload中的newCookie()>2 o0 ]$ `' K5 T$ P' T5 Q) `
..................
8 r' k) b4 [ W& ^5 C- d, {1 z 三、BCB与Delphi中用ISAPI对Cookie的存取:3 Q* p1 l6 Q' g& u
[注:Delphi用 .代替BCB的->]
' T% e% O* g" z: P6 H8 h- { 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
& {5 p9 n! c8 M: P3 C它也可以读取与存入Cookie变量:
; P# l; O. s: h2 ]7 f; h1 _0 v8 e; [ 假设处理用户提交的方法如下: ! t: O5 e+ B, d0 u8 T% H4 T
void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 0 {8 b9 k' P4 U; J- Y
TWebRequest *Request, TWebResponse *Response, bool &Handled) $ P* C R h6 N! \- u
1>从客户机中读取Cookie:
8 q% }5 j, n/ D8 n+ E* B1 z% x; }( ] Request->CookieFields是个串数组TStrings *,如果不为, s; L: G8 B Q" a- }
空,每一行都将是如下形式:# C& o) |) t$ a9 q$ T4 m
Cookie变量名=值
% G; F9 c5 u% S6 s共有Request->CookieFields->Count个变量,
6 o+ o; Q6 y7 b6 R$ X变量名为Request->CookieFields->Names; (i>=0)
# B% t9 o3 l* `/ vReauest->CookieFields->Values["变量名"]就是对应的值;, G8 _/ T8 J. ]8 N* y$ s: V
请注意: 客户首次访问网页时,客户机中并不存在你将要设的7 W ?8 `9 Z* o h3 A
Cookie变量,所以第一次Request->CookieFields将是空的; * t! |1 b5 k9 r. Y- a
2>将Cookie变量保存客户机中:" r3 W& {) \+ g( M( B. Z0 v' M
TCookie *pNewCookie = Response->Cookies->Add();3 P" H$ S7 s# B. u* z1 T3 b
pNewCookie->Name="变量名1";
! v9 w' R( I+ y9 g pNewCookie->Value="值1";( X1 X0 C8 T5 C+ m
pNewCookie->Expires = Now()+366; // 保存一年
3 I+ ^ w/ W- ]8 s5 L) P就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
, M# z6 F0 r. d" s4 w: E" @+ Y) }举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交+ p8 v. K# E! [" p( J5 c! \
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
, z$ F- e+ P4 A4 z, Q9 ivoid __fastcall TWebModule1::WebModule1WebActionItem1Action(. A# f+ N6 m+ n3 e- S! K
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
# @% _( k& p. E. O6 F bool &Handled)' F: s% P$ \3 f5 O p5 V
{# _0 b- k% `, f0 h' n( Y$ p
TStrings *cookies=Request->CookieFields;5 A5 y( S& F. t' q
String oldvalue1=cookies->Values["count1"]; // 取count1旧值
4 u! y1 y- P1 Q9 W! P! \ f String oldvalue2=cookies->Values["count2"]; ! S2 B8 |7 k/ L# H
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
/ l8 A% c2 n) y# N: P; T1 ^ String newvalue2=oldvalue2.ToIntDef(0)+100; : {9 m" q" k, `# ~
TCookie *pNewCookie1 = Response->Cookies->Add();
I% V e, S, X$ I" M7 Z7 E pNewCookie1->Name="count1"; file://更新Cookie
{9 Q0 r; ]8 E$ [9 j. L! g# b pNewCookie1->Value=newvalue1;
$ ?' |5 F4 l i* }1 o pNewCookie1->Expires = Now()+366; // 保存一年 6 z. ^; h% v, m& q% B; N& P n
TCookie *pNewCookie2 = Response->Cookies->Add(); ^5 h" g% j8 E' z a5 N
pNewCookie2->Name="count2"; file://更新Cookie 9 F8 ^/ Z% r! ^- h# |8 n. \
pNewCookie2->Value=newvalue2;
, P, g( L+ i& I9 [& d6 ]' ] pNewCookie2->Expires = Now()+31; // 保存一月 & D6 g% y# ]# e/ L1 j9 C
// 向客户显示Cookie的值: F* a b+ ]! X5 o! M% X9 `
String h0="<html><head></head><body>";
9 @" p9 \3 {9 Q3 z1 h String h1="</body></html>";; |, O; H% J3 w( m
String s1="计数值1="+newvalue1+"<br>";% M4 J2 O* `; M5 G- I9 J! I
String s2="计数值2="+newvalue2+"<br>";
8 \- t2 s; ^$ Z3 b/ A( I Response->Content=h0+s1+" <br>"+( n+ ?' }2 {1 @& h9 v: b) b
s2+" <br>"+ h1;4 {5 k9 J4 ?( T4 h7 ?( N# s
}
: H7 T8 @1 F( }9 X4 t4 N |