|
[作者:扬州BCB] ( e# q# A+ u6 l
一、 Cookie概述:
8 v6 E1 ]% s% h+ V% w. g 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。& T. f. C& R. x8 f' ?
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
; Q/ E8 n% |) Y, q* a内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可: I f6 [9 q2 {
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量! a" Q" f- I& y4 E
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
& w) x5 K. g8 j! v, T2 U- p6 g所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网' y2 ?( E5 _/ k. k& v
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫' F- N: ~ t$ m, T
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
: |$ {2 C- A! j5 ]: S* @4 |$ [4 ^使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; ; T6 K$ L+ ~* G) }. Z
二、JavaScript脚本对Cookie变量的存取:
- N( o- w8 M5 K1 J0 { k+ d; L' B JavaScript是运行在客户端的脚本程序,用它可将文本输入
& X# p: ~( c- Z框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
4 Z- p3 k' Q' O3 F* J3 [& U微减轻Web服务器的一点负担: 0 | S+ X4 w( i, m; W9 h. P
1>读出Cookie:
$ P/ Q9 M: X! b- O( A" b6 y JavaScript中可通过document.cookie访问到所有Cookie:
; e3 H' t/ ^7 \2 c+ W; V1 n* P "变量1=值1;变量2=值2;变量3=值3;"
* ]' s6 \" C3 [3 q 需经过串分解就可得到每一个变量名及值;
3 t1 e+ \7 {5 [ 2>写Cookie:
/ R$ ~, y. ?) F+ ]+ t5 Y email="bush@usa.com";
5 y* o b5 _4 p8 J firstname="jorge";
" q1 i( L2 z8 X lastname="bush";
2 Z+ f; l4 n5 Q. u" X3 m3 J expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
: ]" b' m( z. b! G' V# O document.cookie="email="+email+";expires="+expireDate;
# R3 [( d+ K% ?8 } document.cookie="firstname="+firstname+";expires="+expireDate;
( {% h) g& c2 v5 ? document.cookie="lastname="+lastname+";expires="+expireDate; 6 K( l% Z% k$ Y% i: W' Z4 y
下页一例,将网页的文本输入框域变量NAME自动保存下来:
; v5 z: b, g3 f0 @<script language="JavaScript">
+ K- ]/ P7 K5 y4 C4 N7 L* J9 }<!--% i2 U4 G, v ~+ N9 B$ F# l
function getValue(s,n) // 分解Cookie表达式s
8 ^4 `- Y' C, w6 K6 o) A{( ^, \- ^/ P' o1 I
var pairs=s.split(";"); // 分解成串数组. v" S, ?! [1 p
for (var i=0;i<pairs.length;i++)
$ C. j8 N% ]5 j: l$ |( Y6 ] {2 ~' E2 ]( A7 ]) T
var pairSplit=pairs.split("=");+ j, r$ G/ O) ?" X1 E5 j
if (pairSplit[0]==n) file://查找n; M" ~( i" E) U0 T6 e' l; m d2 ~
return pairSplit[1]; file://取到n的值/ g# k7 I! y+ w: q# k1 _
}
; h u) j# J. Q: u4 y- e8 p return "";
: m' |2 o( s( e H( i, B e}, i l O' T% U" F6 T0 z
function getName() file://取Cookie中的姓名NAME
6 M& [/ o) k6 f+ i4 U$ L# n{5 ~! S' a1 K7 }; v
var s=document.cookie; // 取所保存的Cookie0 b! H+ E* X; K& X
NAME0=getValue(s,"NAME");- K3 _6 l" U4 M% Z7 o3 e
form1.NAME.value=NAME0;
9 ]# A: P- ^! K1 V% I- R}
, b% p0 P- U7 _function newCookie() file://将Cookie中存姓名2 G7 v8 i0 j d6 D+ O
{
9 O! c$ X% ?3 a3 x- ]% ~ var s=form1.NAME.value;
4 b! f6 n9 s* F9 x: f d2 [0 p7 i if (s!="" && s!=NAME0) // 非空则保存
) P/ |+ i# A5 r0 J% f9 y {* X4 E9 A% l! T9 l% Q0 S
s="NAME="+s;
/ W/ A- x1 Y& y* [2 A: z6 L s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
" Z. u. R9 z. _0 n0 R# ` document.cookie=s; // 将保存到客户机中( \% k5 g, i: @8 o: f9 t
}
- D2 g% x- O8 Q& v/ N% t) `}5 w' p( q, J3 {8 V
file://--></script>/ P) c+ m! B- E$ c" C) U* V' P/ Q( G
.................. # l6 a1 ]# q9 M# i+ F3 L
<body bgcolor="#00FFFF" onload="getName();# I/ K1 }5 N9 C T9 G, K
form1.TEXT.focus()" onunload="newCookie()">: j" L3 U% d' \" z+ w/ @8 [6 x
<!进入本网页时将执行onload中的getName()>
% R# e& P; N; L) S: B7 [4 m( J<!退出本网页时将执行onunload中的newCookie()>2 D3 e& B1 `0 D* I
.................. 6 u9 b6 V/ o9 n3 S
三、BCB与Delphi中用ISAPI对Cookie的存取:
, [, e `: w9 o* N1 v V4 { [注:Delphi用 .代替BCB的->] 8 X) |+ v1 l, B n+ e
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
8 W: ^2 l- w8 [. {, ~. @9 Q8 g( v它也可以读取与存入Cookie变量: " P2 e8 P( u3 H3 M( R% W6 @! I: F
假设处理用户提交的方法如下:
" ]7 z0 O9 L; l/ i# I/ M4 G6 u* Evoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, : H8 y0 R) v0 x; n) Z, H% q
TWebRequest *Request, TWebResponse *Response, bool &Handled) 9 [6 k. u) K8 z8 ]( a
1>从客户机中读取Cookie:
* a- q( H+ V s! q% X& e7 ` Request->CookieFields是个串数组TStrings *,如果不为, ?9 ^# [' i- K1 k3 V4 ^7 w
空,每一行都将是如下形式:
) V1 h2 E6 }* F6 m8 X5 [+ T, b7 ~5 n Cookie变量名=值2 }' K" H S$ x* z7 s0 w5 ~6 J) Y
共有Request->CookieFields->Count个变量,, \2 {& T0 P: p
变量名为Request->CookieFields->Names; (i>=0)
% L* d; U9 \. n: yReauest->CookieFields->Values["变量名"]就是对应的值;3 k) R8 ~6 e6 s8 N, u- ?
请注意: 客户首次访问网页时,客户机中并不存在你将要设的
8 g9 k7 K7 o" X9 n5 s2 UCookie变量,所以第一次Request->CookieFields将是空的;
) b/ X1 }0 N: A7 q0 q$ @ 2>将Cookie变量保存客户机中:3 e) e2 r; |' C% j
TCookie *pNewCookie = Response->Cookies->Add();0 B- ]1 s1 o$ _& N( a0 w# l
pNewCookie->Name="变量名1";. I( f+ g2 t' c
pNewCookie->Value="值1";
' A% z8 g* p$ c* i0 W2 e pNewCookie->Expires = Now()+366; // 保存一年1 d' l' G [- _; S8 \( ?
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; " N. P+ m- _7 S# y' `( G
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交8 q7 ?# |3 \2 ~* W6 c
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
& W" u1 E' R6 X/ R* i3 x! ivoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
. _3 c% r7 T1 w5 |$ Z, J* Y TObject *Sender, TWebRequest *Request, TWebResponse *Response,
. v% g0 Z1 Z/ [; k" S4 k) r$ g bool &Handled), \, @& o: K* X |5 D2 k
{
% n6 d) W3 o& s: Z( }' k( D' `& ^ TStrings *cookies=Request->CookieFields;
6 H2 W" Y" U' Q# k String oldvalue1=cookies->Values["count1"]; // 取count1旧值
8 E5 F7 Y" o! D& z2 t. e8 ? String oldvalue2=cookies->Values["count2"]; 2 Y( `' y6 }: ?7 O
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
$ }0 u0 a; ?1 m8 q String newvalue2=oldvalue2.ToIntDef(0)+100;
5 \0 ?9 Y8 I- Z) A$ F! G6 \ TCookie *pNewCookie1 = Response->Cookies->Add();+ g& p3 D" L2 `" k2 z" p+ M5 V1 v
pNewCookie1->Name="count1"; file://更新Cookie8 C0 N" h1 z4 {1 ^4 z+ R7 S9 g1 k
pNewCookie1->Value=newvalue1;
. U5 j9 U- q$ H4 v pNewCookie1->Expires = Now()+366; // 保存一年
- `3 D4 p/ `! @ Z& t$ q Q$ k% L TCookie *pNewCookie2 = Response->Cookies->Add();6 m' q3 z7 ]3 F9 ?! N5 b. N
pNewCookie2->Name="count2"; file://更新Cookie - @1 N! w" m+ o3 W, ?& V
pNewCookie2->Value=newvalue2;$ }. P% r% U, H3 w5 \, s
pNewCookie2->Expires = Now()+31; // 保存一月 * n. ~) s7 C ~' I
// 向客户显示Cookie的值
0 G7 Y5 z% \, ~8 k. t4 N' A O2 ^ String h0="<html><head></head><body>";" s" _9 n, y# T( C2 U
String h1="</body></html>";2 b! V' @# M: \
String s1="计数值1="+newvalue1+"<br>";
# i" s4 T2 ^! C* v String s2="计数值2="+newvalue2+"<br>"; 1 Z: V, G/ h' K! v3 O, R
Response->Content=h0+s1+" <br>"+
1 z# i' y) B( w, g s2+" <br>"+ h1;, u( w5 L, F+ b& A9 a
} % w. l" I" _3 S
|