|
[作者:扬州BCB]
% I( P8 W/ Y1 M. K. k* [4 j$ c5 E 一、 Cookie概述: $ Y9 _9 ~( |+ c/ x1 [5 F4 E. r: N
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
" W5 [2 L1 r6 R. r8 s Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机& G) b8 Y3 B* Z$ _; o$ T/ v H+ s
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
/ a8 f+ w9 d2 v- E" @测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量+ m- T+ d9 H( G1 w( E x4 K4 g8 g
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
/ Y3 t; V, h ?9 ?所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
" [+ D1 \# S% k& R3 m" f6 Q页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫# F4 |0 J o2 h0 J5 D9 \7 h
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,+ X: H0 Q: ^# w& R. O% H, @6 y' [
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; n/ ]5 p# K8 ?
二、JavaScript脚本对Cookie变量的存取:
: n# J; e0 E, K3 P% G JavaScript是运行在客户端的脚本程序,用它可将文本输入! J* k! z/ P' c- k9 g
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍' y. K. l4 s: M+ |6 m$ ^0 O8 s
微减轻Web服务器的一点负担: # h" N2 ~- M8 U) ~" E& C
1>读出Cookie:3 \, u) B) |; B" Q
JavaScript中可通过document.cookie访问到所有Cookie:3 {& O& }; Z* Z$ z
"变量1=值1;变量2=值2;变量3=值3;"" Y2 ~" s+ [+ A: Z ~+ Y
需经过串分解就可得到每一个变量名及值;1 |2 v! _& U: O6 j. l' B
2>写Cookie:
% B/ F/ o: P! E9 d. @2 ~ email="bush@usa.com";
7 t& o0 i) L3 U, k( q3 ^) v+ X: s firstname="jorge";
5 x1 c( R% g' J lastname="bush";$ O, G( Y# |$ K2 P% I$ |
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
% R0 u; n. I# J Q. q document.cookie="email="+email+";expires="+expireDate;3 Y8 j( n4 Q8 W. b' b
document.cookie="firstname="+firstname+";expires="+expireDate;
& ]. e: r' N; F- { document.cookie="lastname="+lastname+";expires="+expireDate;
2 G9 L$ H! ?: M" i 下页一例,将网页的文本输入框域变量NAME自动保存下来: ! C1 X9 p: p: \" `5 L
<script language="JavaScript">$ [5 i O. o% ?4 n% Y" a
<!--7 h8 g) V$ s' P# G5 n4 l
function getValue(s,n) // 分解Cookie表达式s/ f& S* L' ~9 b, |: B
{/ G* S3 ~& F* y$ ^9 G; T* w) h* g
var pairs=s.split(";"); // 分解成串数组
* z, S: o! G6 h for (var i=0;i<pairs.length;i++)
7 w! v1 C: B B. ~" H {2 ?, N4 ^ h: Y- D u/ G8 v9 K
var pairSplit=pairs.split("=");8 S" f3 F$ ?* ?( d" c
if (pairSplit[0]==n) file://查找n9 R1 b0 F u5 W
return pairSplit[1]; file://取到n的值" G j3 \: `# m6 U" ~0 w
} 1 [( D& c& y: F0 ?: d* F S
return "";8 K5 k+ p2 m1 n/ c
}: E: j* L/ Q2 E% s1 ~* w- Q
function getName() file://取Cookie中的姓名NAME
: `# g( S! r, f! X" [. b{8 \: M) L& z5 K% [7 ^/ [/ a
var s=document.cookie; // 取所保存的Cookie; E: _% @* s* R( V) ~* @
NAME0=getValue(s,"NAME");% Y: b7 @! u* a2 V
form1.NAME.value=NAME0;. Z5 t0 d1 i/ |5 K! t( ~& c! j
}
1 j; w4 g7 p' l# yfunction newCookie() file://将Cookie中存姓名
( |3 `& a0 V9 p$ y+ z9 {: G* W7 a{+ {+ Y* \; V) }6 z2 v1 i6 i4 L4 m
var s=form1.NAME.value;
/ I' T- d2 j+ l: |# t if (s!="" && s!=NAME0) // 非空则保存% V9 w- q( I7 `7 N. b& B
{2 t2 x1 a" G+ h P% B1 r6 S
s="NAME="+s;
4 m2 V: [5 t* t7 S$ R$ B5 B; H s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
, G6 i9 c( k- v9 v' n document.cookie=s; // 将保存到客户机中
0 p6 b1 }* z$ T0 c( B } 6 A, \* X" u7 c- v2 a& `
}! v# i- e4 v: n$ s# n9 h
file://--></script>& P7 R3 F+ N+ i1 e9 A) K
.................. - b$ w9 | K2 w3 |6 I
<body bgcolor="#00FFFF" onload="getName();! ~' O+ Q8 i/ N+ i. U" ]# X! A6 ]
form1.TEXT.focus()" onunload="newCookie()">; X: H8 L/ t9 S
<!进入本网页时将执行onload中的getName()>
; i6 Z: [( u- o" m4 D" H4 x, N<!退出本网页时将执行onunload中的newCookie()>
7 V& [1 Y5 z/ ~# L& Z# x.................. * {" d! c! T$ S: H9 _
三、BCB与Delphi中用ISAPI对Cookie的存取:
# J. _- K* n# K/ k3 W0 l( E( B [注:Delphi用 .代替BCB的->]
: R. x5 Y u5 `& F8 C1 i; P( C 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
: e9 w7 O# L& j它也可以读取与存入Cookie变量:
. X: k7 l* g% l( l) R. R4 v 假设处理用户提交的方法如下:
% D0 X4 [; }0 E7 c+ {8 A' v& }void __fastcall TWebModule1::WebModule1Action(TObject *Sender, : K& n' r* V0 L3 c
TWebRequest *Request, TWebResponse *Response, bool &Handled) : j+ V5 G- H i4 K
1>从客户机中读取Cookie: / @& J, P6 z; q7 ^* B
Request->CookieFields是个串数组TStrings *,如果不为; J# r# { A( S
空,每一行都将是如下形式:
8 e( S" Y' s0 J; r; V Cookie变量名=值6 V1 `3 y! D! g9 J" z4 d
共有Request->CookieFields->Count个变量,
8 T" k7 g- J, h1 o. K; G变量名为Request->CookieFields->Names; (i>=0)2 _+ g" O7 {+ i& g4 Z- g% P
Reauest->CookieFields->Values["变量名"]就是对应的值;7 C: F3 @$ c. a* X2 d
请注意: 客户首次访问网页时,客户机中并不存在你将要设的% G! K% t2 G$ z& O _. @
Cookie变量,所以第一次Request->CookieFields将是空的;
" `$ y K2 ~/ t' V 2>将Cookie变量保存客户机中:& J5 K# }$ ^) y* n8 ~5 }* p$ @% b
TCookie *pNewCookie = Response->Cookies->Add();; @. r( e9 x% @, M( U. |: |1 g) L
pNewCookie->Name="变量名1";
3 R3 r8 |# R' Q# ` pNewCookie->Value="值1";# f% ]% R v ]8 E
pNewCookie->Expires = Now()+366; // 保存一年+ H5 N! J* n- i6 ^. w
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; ' L" v3 x" E& J* H+ ]) B+ z6 T
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
- D# e' ^. ]0 I3 G J.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
; R- V) r, E) p. C4 Z. G k5 L7 }7 R+ _void __fastcall TWebModule1::WebModule1WebActionItem1Action(" o, \/ ?! w# y
TObject *Sender, TWebRequest *Request, TWebResponse *Response,5 z2 i4 o4 B T/ u/ R5 `) ~2 z
bool &Handled)
8 x; d# a; [' \& G{
+ U2 h5 n# t# {+ o TStrings *cookies=Request->CookieFields;
, k. [$ d0 H* R, g- B String oldvalue1=cookies->Values["count1"]; // 取count1旧值
+ x% L* r' U" a# h+ p, d String oldvalue2=cookies->Values["count2"];
# Y3 [3 G2 l1 o) h; n String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
4 _$ A& Y+ l& G5 b3 J& F String newvalue2=oldvalue2.ToIntDef(0)+100; * M6 T4 I& Q" w4 _* D( q1 X
TCookie *pNewCookie1 = Response->Cookies->Add();
" v: N! Q5 X/ m- w9 _+ v& `0 l pNewCookie1->Name="count1"; file://更新Cookie8 Z* P- m' x2 J$ Q
pNewCookie1->Value=newvalue1;7 {+ g3 j3 ^- o" N: l
pNewCookie1->Expires = Now()+366; // 保存一年 $ @8 ~! J7 n! M6 E3 T2 R/ b0 C
TCookie *pNewCookie2 = Response->Cookies->Add();
4 T: `" c8 L& D/ a' F pNewCookie2->Name="count2"; file://更新Cookie
, P$ R$ z" ]) Y6 m0 J! D pNewCookie2->Value=newvalue2;
5 k; Q7 K S8 G5 Q pNewCookie2->Expires = Now()+31; // 保存一月 % ~: F3 Z; ?$ q# _9 ]+ `) ^
// 向客户显示Cookie的值1 _3 B5 h% `1 r
String h0="<html><head></head><body>";- b7 s$ d- ^2 E% D: ]' y
String h1="</body></html>";1 y$ r* y2 y1 w
String s1="计数值1="+newvalue1+"<br>";* _' }! A$ \: i7 J4 E# R
String s2="计数值2="+newvalue2+"<br>"; : ?6 w" v% H; e7 @' L
Response->Content=h0+s1+" <br>"+
% ^" E" W7 z# y5 @+ { s2+" <br>"+ h1;6 G7 c `7 m: _- j$ l# @# a) z
} ; S1 w' z. G) T; Z
|