|
[作者:扬州BCB]
# y6 R5 `. H5 G; R& Y4 i8 a# r 一、 Cookie概述:
* e* I4 G3 B. W2 l 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
4 C8 P: T) w z! l0 Z5 S Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机& @5 \+ a% z2 e: b3 C. n& Q4 d) i
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可) @0 A% e, H% z( _% e- x/ ~( \
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
, i1 h" c- _, Z( h* `的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
% E. W" v& v& Z G* s; H! O所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网! }7 j& x- f p& i
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫2 o/ s3 p2 ^# i! I6 n8 P
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,8 Q( ?6 r' M7 v J
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
4 _0 g% f b* Z, q 二、JavaScript脚本对Cookie变量的存取:3 Z9 `2 X( J" _
JavaScript是运行在客户端的脚本程序,用它可将文本输入
5 v$ y* b, V; D* _! Z框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍1 q9 p7 d" a5 N* x, s5 {0 s
微减轻Web服务器的一点负担:
$ e3 d) q+ Z- @; b' O# r) n 1>读出Cookie:
, |, _) g. C; t; l JavaScript中可通过document.cookie访问到所有Cookie:9 d v; s- h. ^8 J
"变量1=值1;变量2=值2;变量3=值3;"
4 G. x# y. G( ~) `; _, z- m 需经过串分解就可得到每一个变量名及值;
4 \ i3 L5 s0 l+ @ 2>写Cookie:) I) S- k+ |' S9 i
email="bush@usa.com";4 u% _& G) ?5 M; Y. d1 I
firstname="jorge";
3 X: [7 j: j5 ^ lastname="bush";
9 N/ s# r) u: G% K/ y- p expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
4 S0 W$ `6 @ N( k. ~# g, G( K document.cookie="email="+email+";expires="+expireDate;
6 \: Z |: [) a, T0 q: x9 ] document.cookie="firstname="+firstname+";expires="+expireDate;
3 _* p: \% t# {: x! F/ z document.cookie="lastname="+lastname+";expires="+expireDate; 3 C7 ~9 ]7 m2 f' Q k
下页一例,将网页的文本输入框域变量NAME自动保存下来:
' A% [* h1 A& M6 W) N1 _; I/ f<script language="JavaScript">( J8 _9 K1 Y3 y+ j
<!--9 ~" S M" T* P! b( G) X- i' }, B
function getValue(s,n) // 分解Cookie表达式s% H, ?, ~2 z9 r* _7 h
{
& h+ Z: |; e+ Z, E3 T- E7 E! C var pairs=s.split(";"); // 分解成串数组
) _9 v, {" N5 X& _8 z for (var i=0;i<pairs.length;i++) I* Z, L% |1 b! n9 p
{
! B- E% D& t# d, T! L var pairSplit=pairs.split("=");
6 \* I& ^$ E5 H if (pairSplit[0]==n) file://查找n
3 C" K1 b' Q) T0 Q: i5 B9 ` return pairSplit[1]; file://取到n的值; O1 ^, t3 u) O5 y ?2 q
} / F" G1 R- {" |' x9 ~% z) y7 O' ~
return "";
" Z4 w( k1 ?! c9 r+ I5 M}5 [" _& c% P, {" F/ j; j. \- y$ Y
function getName() file://取Cookie中的姓名NAME
# @: Q7 O0 s% E% O, G2 s{( Q3 S3 Z8 ] K2 F: q
var s=document.cookie; // 取所保存的Cookie( g( \, s3 j( A, p0 Z, G
NAME0=getValue(s,"NAME");9 |' A* p" x. H0 M0 u# K
form1.NAME.value=NAME0;: h# J( O+ s0 u$ |* q6 s! _3 N* b: F
}
1 O& `1 [6 e+ [4 s- M7 O- D% `function newCookie() file://将Cookie中存姓名
' M& r1 i' r7 w. Q$ Q2 M{
4 _: g6 E' N& y# Z9 O) _$ S var s=form1.NAME.value;" e9 \ e) N' l& P: S/ i
if (s!="" && s!=NAME0) // 非空则保存
z, R$ I7 m+ J3 j/ l- n; b7 j {- d& @* U( g X: A) `: y
s="NAME="+s;
6 I4 Y( x# c3 u, p/ K) v s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";+ l, | Z: N" Y
document.cookie=s; // 将保存到客户机中+ y+ {9 z1 i, T( y$ A n/ _: A: n/ J# U
}
5 t! c: i& R5 l7 z}
# ]; \/ n( j1 J8 Dfile://--></script>( i+ P0 a9 f; e7 w4 W8 _6 y
..................
' L2 R8 Q/ f5 m# O<body bgcolor="#00FFFF" onload="getName();
* A1 ]; k3 l! K- {; Q, l0 q form1.TEXT.focus()" onunload="newCookie()">% `6 J" s! T' ~
<!进入本网页时将执行onload中的getName()>
2 q' m% z+ S L0 j5 P! d8 H<!退出本网页时将执行onunload中的newCookie()>' c9 ~0 _ C2 `, C# @' K
..................
$ b) d, S% B3 y2 E2 w. D 三、BCB与Delphi中用ISAPI对Cookie的存取:# G, M0 I; R+ k) l) g
[注:Delphi用 .代替BCB的->]
" D8 d: z& W) j+ Q3 G6 i- W f5 y: B 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,& J; O1 q+ I5 Z
它也可以读取与存入Cookie变量: 3 o _# h; K/ h2 o
假设处理用户提交的方法如下: + ^2 H* J" K2 a
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
8 j3 [6 X6 Y. OTWebRequest *Request, TWebResponse *Response, bool &Handled) $ z4 @5 e7 A' J7 p9 n* ~
1>从客户机中读取Cookie:
$ x0 _: z. b2 X- r$ j Request->CookieFields是个串数组TStrings *,如果不为
6 d: T4 @3 h6 N8 D2 o8 C+ B1 ]空,每一行都将是如下形式:+ C5 E7 v) c8 |: P
Cookie变量名=值3 }) x8 @' n% T. n* \
共有Request->CookieFields->Count个变量,# Z( u4 J$ c! X: [0 j" ?5 v
变量名为Request->CookieFields->Names; (i>=0)
+ O' n% X# W) ~+ k$ Z0 @Reauest->CookieFields->Values["变量名"]就是对应的值;7 X" C \( c6 F8 [2 A2 ?
请注意: 客户首次访问网页时,客户机中并不存在你将要设的# W4 ~' E3 v0 L7 j# Y
Cookie变量,所以第一次Request->CookieFields将是空的;
* B0 d8 h+ W. B/ k2 H3 k 2>将Cookie变量保存客户机中:$ l% \7 E" s7 F1 F' N. j6 f
TCookie *pNewCookie = Response->Cookies->Add();
- V& r, {" k# }3 Q pNewCookie->Name="变量名1";$ ~# K+ \ S: f; u j1 v
pNewCookie->Value="值1";
1 M8 `$ Q7 D3 d+ i2 t) ]& I6 k pNewCookie->Expires = Now()+366; // 保存一年" |5 f% j5 O% }. @; \
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; ! L7 Z/ B9 N9 w5 Z8 o! Y0 Y
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交, p; i0 J/ ?1 M; \( f
.DLL后,每刷新一次浏览器,将看到计数值将变化一次: 2 l' h: Q5 z. f ~% a. A5 K Q
void __fastcall TWebModule1::WebModule1WebActionItem1Action(7 K+ O: q7 W7 @$ h
TObject *Sender, TWebRequest *Request, TWebResponse *Response,$ I2 r' Z( K" w2 N4 r3 o* k
bool &Handled)' F. N/ J: k4 l; k2 n, T5 w
{
% f. U' u ?4 F TStrings *cookies=Request->CookieFields;
7 @3 t0 K# H F. J String oldvalue1=cookies->Values["count1"]; // 取count1旧值- a- Z( q. a0 a3 r3 t2 b" I" H
String oldvalue2=cookies->Values["count2"]; 6 a/ Q3 V& `/ L) M
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
; y5 g! m0 m. V' o# n String newvalue2=oldvalue2.ToIntDef(0)+100; ' L; U5 L/ Z& d8 c* z. P
TCookie *pNewCookie1 = Response->Cookies->Add();
% d- T5 X- n8 \& P& C pNewCookie1->Name="count1"; file://更新Cookie$ Y3 Y" ]+ { b( m
pNewCookie1->Value=newvalue1;
' x, @8 T- S: \4 z% ]. N1 i pNewCookie1->Expires = Now()+366; // 保存一年
2 i2 y* R4 F4 m1 _8 d TCookie *pNewCookie2 = Response->Cookies->Add();/ w8 K+ C' u9 K& b: B
pNewCookie2->Name="count2"; file://更新Cookie
0 e ]* }$ J% m- s pNewCookie2->Value=newvalue2;
+ H: s8 o$ V% ^# u, c8 j/ ] pNewCookie2->Expires = Now()+31; // 保存一月
4 q' M# M9 z+ U/ f // 向客户显示Cookie的值
/ P m/ n8 P! Y% } String h0="<html><head></head><body>";6 A% h; v' G' Z) ^+ M4 b/ b
String h1="</body></html>";! g a+ N' z0 I6 N# b) }% M2 w
String s1="计数值1="+newvalue1+"<br>";2 k4 @; `/ g' a2 G) B
String s2="计数值2="+newvalue2+"<br>";
7 Z& d+ i- K4 B4 z: L0 q Response->Content=h0+s1+" <br>"+
9 V# N' D( T4 R, W+ s% F s2+" <br>"+ h1;
8 }* J2 {8 e, Y0 ?7 I}
# X6 Y+ H) e4 s# L7 F |