|
[作者:扬州BCB] $ V3 t7 [4 | J6 r% e( Z
一、 Cookie概述: 2 F" R ?- P+ W u
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
0 U. O6 p6 A$ I ` Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
/ a; C: n( \: K3 T7 W: C% G, M内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可- d) e) u$ c2 \ ]. |- w; X( m3 F: c
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量' Q' [$ ]# K( h4 h% b
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次4 B; {+ I) F( l! C" G9 z
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
1 N, S/ J+ Q/ m/ Y% B. e页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
' f% d, ~- ?+ y1 I小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
5 u: R: D% k& ]+ k9 m" k t使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; * P2 ?' Y/ l1 X# j
二、JavaScript脚本对Cookie变量的存取:/ D" r' s! I/ ?( @. G4 T, p
JavaScript是运行在客户端的脚本程序,用它可将文本输入
! Y( M7 U- E& ] w框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍1 Y7 C1 v6 L1 ~5 {( \" @2 M
微减轻Web服务器的一点负担: : `9 p& A# y- B
1>读出Cookie:
" g3 M' i% e0 _ JavaScript中可通过document.cookie访问到所有Cookie:
$ A9 O1 K) h. N: U "变量1=值1;变量2=值2;变量3=值3;"3 R( E+ x7 [% w; _
需经过串分解就可得到每一个变量名及值;
# ~8 P. H$ }0 `6 ~$ U" S1 Z 2>写Cookie:& b0 w4 S2 d. c4 B8 q
email="bush@usa.com";
5 h) S3 M( h+ E( C: V firstname="jorge";" I; W1 v/ g5 U0 a. N. M
lastname="bush";
# Y7 k- P9 Q+ r ?( b expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
7 r8 Z9 w' ^" C; A. |1 o; Q" ^' q document.cookie="email="+email+";expires="+expireDate;. F3 t( }2 \) X" y5 H& e
document.cookie="firstname="+firstname+";expires="+expireDate;
& m2 K& p9 ~4 C8 D9 _ document.cookie="lastname="+lastname+";expires="+expireDate; 3 @( ^1 F, s+ ^, W0 Q
下页一例,将网页的文本输入框域变量NAME自动保存下来: 9 d( q3 a5 W! x9 G3 V Q
<script language="JavaScript">
$ n6 x& r8 S/ E: P: Y8 ~1 v' l! p<!--: }( s: R8 E# r" x' ?( r( l- s
function getValue(s,n) // 分解Cookie表达式s' y$ h G$ n% M6 C" Y
{
8 {" Q% O9 S3 [) K/ d! x/ G var pairs=s.split(";"); // 分解成串数组
6 D; R/ g$ d( x5 s for (var i=0;i<pairs.length;i++)1 o* }0 E: ]3 i8 n
{4 y$ D( G% r. e) H" B* @7 W, o- @
var pairSplit=pairs.split("=");3 k2 o ^; Q$ j& x$ @3 u
if (pairSplit[0]==n) file://查找n% A; Y# R9 N3 J$ }( J+ e( m, ]
return pairSplit[1]; file://取到n的值3 _2 {! ?+ L6 N1 ~0 A" b4 h
}
2 [7 Q5 I0 S% n# ^3 P return "";
( Z1 S) _. a6 V1 w; _( V}' p% B* E4 A4 b# u
function getName() file://取Cookie中的姓名NAME3 z/ f: G1 F3 ?, G1 x
{+ M% U5 f2 ~! y, b' L
var s=document.cookie; // 取所保存的Cookie
L# b, x# U2 M: } NAME0=getValue(s,"NAME");
* t: h& w. g6 P H' L7 l form1.NAME.value=NAME0;
4 I. O- O4 ]3 e& j5 o y}. k3 w& o5 m) z0 A% I
function newCookie() file://将Cookie中存姓名
: y! j; ^: C0 H- u0 I" x! ^/ f$ H{& Z& Y$ d( S8 y$ n
var s=form1.NAME.value;9 C) @- B1 y% n. j, l
if (s!="" && s!=NAME0) // 非空则保存' Q! s! v( `! N$ {
{* q. d; }: }5 n; c$ }
s="NAME="+s;4 t9 W4 K' n( }$ ~5 _% e
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";6 T+ ^$ ^2 B9 t. S3 b
document.cookie=s; // 将保存到客户机中
& X" B/ v# y& _! p }
8 k3 \& U' g, o( C4 T W+ @} [( E6 o( b; F; O5 e! G
file://--></script>
( p/ ~2 V6 g- ?! ]1 G: o. `.................. % v6 b# G) [) g3 W/ o5 T
<body bgcolor="#00FFFF" onload="getName();, H) a5 X _( ]
form1.TEXT.focus()" onunload="newCookie()">' f( T* v& y& [/ {3 o
<!进入本网页时将执行onload中的getName()>0 K- ^5 b) b9 k" L+ s
<!退出本网页时将执行onunload中的newCookie()>
( g. I' f. d' W* F6 c.................. , R e) F. l8 Y7 ?% t7 G7 k
三、BCB与Delphi中用ISAPI对Cookie的存取:& c$ T5 z* p9 Z/ d( b
[注:Delphi用 .代替BCB的->] % }" A. r# J2 Z! B9 f: ?
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,: Y+ o" p" K9 _/ O- f% T/ }
它也可以读取与存入Cookie变量:
3 O# r. H' Q8 ^: K! ?, Z+ ~ 假设处理用户提交的方法如下:
0 v' p' h$ e! E( T+ M l2 ]void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 0 |; ^6 e8 z+ ^# K& {
TWebRequest *Request, TWebResponse *Response, bool &Handled)
/ V2 j: j4 w6 ^+ W) Y 1>从客户机中读取Cookie: ' o# y$ b8 C" x- h- ~" D7 D
Request->CookieFields是个串数组TStrings *,如果不为
2 }4 H ^% H' u C空,每一行都将是如下形式:
' i& c4 w5 x( e& y Cookie变量名=值# z3 b( A7 F2 m9 ]- n! w; P' k
共有Request->CookieFields->Count个变量,
; ~8 M& g3 Z- S& j& j变量名为Request->CookieFields->Names; (i>=0)
4 c; I, w7 K2 P6 K8 Q6 L2 w5 b5 ^/ `. ~Reauest->CookieFields->Values["变量名"]就是对应的值;( O" e/ C* @- p5 @7 v# Z/ w
请注意: 客户首次访问网页时,客户机中并不存在你将要设的
0 l3 M8 L% t5 z9 lCookie变量,所以第一次Request->CookieFields将是空的;
* @/ `- h$ J% T- ~) C# b 2>将Cookie变量保存客户机中:3 O8 x/ C. f) L c8 H
TCookie *pNewCookie = Response->Cookies->Add();: j# A4 Y' j/ w7 B$ \9 n3 E% A* I% ]" ~
pNewCookie->Name="变量名1";* R9 _: R2 o8 n" O
pNewCookie->Value="值1";% w& A* t% ]: m0 H+ e2 L
pNewCookie->Expires = Now()+366; // 保存一年' e T4 i% w6 T$ ?0 X
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
o! i, V1 r+ I7 j# k7 z举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
# X" t ], r& ]" s0 t; R.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
3 G8 k- m2 D& @2 q% y, ~* u" Ivoid __fastcall TWebModule1::WebModule1WebActionItem1Action($ k7 D$ ?- d" M/ k/ ?* \& x
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
6 T" N1 n5 v( @9 b! j2 x bool &Handled)
. A, r% i X" l/ t* G. M% u/ J{
; S0 ~% \2 C$ H% F5 n TStrings *cookies=Request->CookieFields;
, y% x8 \$ T4 j8 l/ f- \. F7 H2 _ String oldvalue1=cookies->Values["count1"]; // 取count1旧值
: f7 L- \5 A+ j: b String oldvalue2=cookies->Values["count2"];
/ R. n b1 n. W" J; r0 j+ O$ f4 g! T String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值- {8 I" i4 z0 g0 m1 Z+ u* b
String newvalue2=oldvalue2.ToIntDef(0)+100; ' M0 S" r: X* k& J$ g
TCookie *pNewCookie1 = Response->Cookies->Add();
6 e! [# @8 t( Y# h pNewCookie1->Name="count1"; file://更新Cookie
5 {9 o, q0 I7 Q# {! i. J pNewCookie1->Value=newvalue1;
9 u# T# F$ @; E+ p# M pNewCookie1->Expires = Now()+366; // 保存一年
3 D3 P+ M6 F) Z4 q* ]8 K TCookie *pNewCookie2 = Response->Cookies->Add();2 F7 X( m. _* M* g
pNewCookie2->Name="count2"; file://更新Cookie
8 F! t: K6 y9 D7 z! d% h/ B) x# y3 @ pNewCookie2->Value=newvalue2;/ u0 s: [/ ^. w7 J
pNewCookie2->Expires = Now()+31; // 保存一月
" e/ }' X* l; `2 [* t/ O // 向客户显示Cookie的值
# ^3 e/ @6 U7 t2 h9 b* | String h0="<html><head></head><body>";
6 K9 [( W2 G! @0 c% _! @ C String h1="</body></html>";
% E/ n1 _6 S* C1 c! N/ c. a7 R8 ] String s1="计数值1="+newvalue1+"<br>";
3 P; Z* |5 H! a4 C; p3 y6 k; W String s2="计数值2="+newvalue2+"<br>";
* D8 S' ^% p8 q: p. x, U Response->Content=h0+s1+" <br>"+9 T. m6 X! F* P$ M/ X& y: _, V
s2+" <br>"+ h1;( W( M" _# T- t; t+ A
}
0 d) H3 N( R; ?! r0 I |