|
[作者:扬州BCB] 7 x# C, |& s' h7 d) k
一、 Cookie概述: - z" e3 T$ }1 A" `( E/ a& h/ W
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。& v" Y! ~8 J+ n. ?% m; g4 Q) A; H
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
$ Q* `7 u9 y2 A/ J1 I4 e: i# l内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可! g: q1 {: q# C, A; K
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
7 N9 D) o) `) h/ G的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
% t3 }0 _6 g( e6 p所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
4 _' |- T* a, f+ _- Z$ U* y页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫6 A; g' {! q: e# W! ]+ R5 y- J- p
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,3 S/ J/ H4 g: `2 U
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; 6 N! z$ Q- u; {5 p$ a+ I
二、JavaScript脚本对Cookie变量的存取:" q6 h4 m, G6 s" k% Y2 b
JavaScript是运行在客户端的脚本程序,用它可将文本输入
) @2 E3 E! W( r' \* x! @框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
4 H+ c8 y$ Y* Y) a+ q微减轻Web服务器的一点负担: ) W( d! @0 J1 Q b* A) v
1>读出Cookie:
, F9 W3 A5 N m JavaScript中可通过document.cookie访问到所有Cookie:
, K, e& w/ @6 A* M1 \! l( x "变量1=值1;变量2=值2;变量3=值3;"/ o* g1 D# b8 l, {% b: m
需经过串分解就可得到每一个变量名及值;
8 B; c7 p! J: R! V9 J9 l 2>写Cookie:$ \8 K7 L7 D. @9 }
email="bush@usa.com";! ~- T7 y w r) c! X; E# u, ~
firstname="jorge";* U/ m* N& m3 M0 P( r2 @
lastname="bush";+ g G0 z! O9 c* ]6 w
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";6 p5 `+ u9 \$ ?6 A$ k. {! z
document.cookie="email="+email+";expires="+expireDate;; N Q4 h# d( }+ N& c
document.cookie="firstname="+firstname+";expires="+expireDate;
. N; ^2 O. ~! z, c" c document.cookie="lastname="+lastname+";expires="+expireDate; # e. |; w; U. t6 p6 j
下页一例,将网页的文本输入框域变量NAME自动保存下来:
4 U, N. j( }5 l: X; {<script language="JavaScript">
2 R* v5 t+ b* b1 z' J! o, L<!--, n& S; M4 H- X% ?, N6 ?% t6 h
function getValue(s,n) // 分解Cookie表达式s/ I: C7 j9 w0 c% J* h7 S
{
) \+ Q9 _0 e ^3 g" s var pairs=s.split(";"); // 分解成串数组
5 u* o E* I+ Z7 [ for (var i=0;i<pairs.length;i++)! h5 v6 |# {7 B$ R& L, o; U" L" B
{
+ s0 x- }& r4 e; \ y var pairSplit=pairs.split("=");
) y4 K$ w3 r W* y if (pairSplit[0]==n) file://查找n
# ~. m3 ]/ b: J$ N- g return pairSplit[1]; file://取到n的值$ r) @- k! g. R9 G
}
9 u- \& j: z6 A, Y' J return "";
; i3 C% d/ A! ] Y0 G, ^% Z4 f: t}. Z4 H( \% _- ? d) h
function getName() file://取Cookie中的姓名NAME
5 C) X2 ~6 }* i$ J8 O$ p{
; r4 {: [! p ~9 @ var s=document.cookie; // 取所保存的Cookie, I8 {& D$ H0 d% n
NAME0=getValue(s,"NAME");8 D5 m$ P1 z% T
form1.NAME.value=NAME0;6 ^7 `" u, M4 ^) \0 U+ e0 }
}
5 ]2 a( b# O# t& l. Lfunction newCookie() file://将Cookie中存姓名
9 u8 ]* h ^" h1 ]{5 {" z3 d5 f! S8 X0 y; N% q& h
var s=form1.NAME.value;$ j E1 w- X# Z* V# p0 i
if (s!="" && s!=NAME0) // 非空则保存
) l U; l" j6 Y {* X! l; c* w+ Q1 Z5 i
s="NAME="+s;
: e2 k* u& n5 z, s s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";: m" N2 \" J/ I7 }5 X$ l0 P1 B
document.cookie=s; // 将保存到客户机中
* {, D4 J' ~/ f0 Z9 | } 1 J6 z- o/ ^3 _- c ?( M7 u9 q
}4 X3 J6 c4 X2 y7 a" j' W
file://--></script>$ i+ g/ @: H4 U/ x. G
..................
1 s+ g0 D4 S* K' R3 X% r- w<body bgcolor="#00FFFF" onload="getName();
' d+ F* J4 Q. t$ N7 m+ n; [, d form1.TEXT.focus()" onunload="newCookie()">3 W8 U: Q# D4 l
<!进入本网页时将执行onload中的getName()>
9 ^) S% {4 R0 A" q! j<!退出本网页时将执行onunload中的newCookie()>: V0 f$ t2 Z g5 A
.................. 6 J( C3 Q2 k( `$ y; [1 s
三、BCB与Delphi中用ISAPI对Cookie的存取:! }- n2 I. x; {" D9 \# {
[注:Delphi用 .代替BCB的->] ; s6 o0 R2 U1 A
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
/ V3 \* B* s7 k/ {' J$ l4 b它也可以读取与存入Cookie变量: " [2 K2 U$ ^% F- u1 W# I
假设处理用户提交的方法如下: + b/ Q5 l! [3 Y
void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 3 V1 n4 s! ~' r
TWebRequest *Request, TWebResponse *Response, bool &Handled) 9 U# f! d) Q0 i* G
1>从客户机中读取Cookie:
- ?% f7 k6 E* G- D. t# w Request->CookieFields是个串数组TStrings *,如果不为4 G1 M* _. v' b, g) u
空,每一行都将是如下形式: n6 C, [# C% Z- ~2 N3 ^' [
Cookie变量名=值
( c$ S: [! G/ ? P4 G" K+ r6 h共有Request->CookieFields->Count个变量,0 A1 v' s$ O1 o5 K/ L) ?
变量名为Request->CookieFields->Names; (i>=0): e4 ~8 l5 g! R1 r
Reauest->CookieFields->Values["变量名"]就是对应的值;
}! S. S$ C1 S$ a6 W S# |请注意: 客户首次访问网页时,客户机中并不存在你将要设的
3 I) [% g4 h; P2 F- h7 HCookie变量,所以第一次Request->CookieFields将是空的; % l& c9 Z- t4 P. u' q; V& `+ {
2>将Cookie变量保存客户机中:
% k; `" Q8 R: |. ^5 z TCookie *pNewCookie = Response->Cookies->Add();
, F& r" _. Y; @& ~* @5 w! U pNewCookie->Name="变量名1";, x8 i, B- n# l2 V, B
pNewCookie->Value="值1";: c( D9 l7 Y w; L9 Y3 d* [
pNewCookie->Expires = Now()+366; // 保存一年
0 P x5 A9 f4 D: }就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; % z+ f/ S! \9 M: N8 Y' o) J9 @
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交5 y7 l! m) R# o5 }8 y2 w
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
/ ?$ f _: V( F$ j3 {1 L* h1 Qvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
$ s! E7 Q) z- j/ A9 X TObject *Sender, TWebRequest *Request, TWebResponse *Response,& [* z0 N& x! z( X4 ^
bool &Handled)
( l( I( \* [2 o" N0 K{
1 r& T8 L/ L4 ?( _4 E7 h TStrings *cookies=Request->CookieFields;# Y. p ^, o8 o. C+ t
String oldvalue1=cookies->Values["count1"]; // 取count1旧值3 Y. z! h5 y3 S, j* u( }
String oldvalue2=cookies->Values["count2"];
0 \3 u: I6 d+ S% z6 v. l String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值4 C) `) \3 K" o, q% l. i' r$ x
String newvalue2=oldvalue2.ToIntDef(0)+100;
6 z( M2 x! l" C# O; z TCookie *pNewCookie1 = Response->Cookies->Add();
. N6 `5 [- S" _/ w pNewCookie1->Name="count1"; file://更新Cookie8 r5 N( i- X R
pNewCookie1->Value=newvalue1;
8 X: l4 X" q E: N: x5 D6 g; h pNewCookie1->Expires = Now()+366; // 保存一年 : H+ {8 J8 P" f. L2 _# @: R3 B
TCookie *pNewCookie2 = Response->Cookies->Add();! U$ {6 t6 c2 t% D3 W" `; p# a
pNewCookie2->Name="count2"; file://更新Cookie + m/ y- z: n- S8 W. k
pNewCookie2->Value=newvalue2;$ g9 }9 L; |. m- I0 L
pNewCookie2->Expires = Now()+31; // 保存一月
" ]% J3 Z0 x5 a. u. X) Q! q# t+ Y9 w: R // 向客户显示Cookie的值$ a( ^7 B( e# r( m# w
String h0="<html><head></head><body>";
1 A+ v7 O: A( `" p( d4 m String h1="</body></html>";$ u4 U' Z4 `9 L: A0 Q
String s1="计数值1="+newvalue1+"<br>";$ I' l0 B2 B( K: U$ ^
String s2="计数值2="+newvalue2+"<br>";
# \; K1 b4 w5 _; p n, Y, [ Response->Content=h0+s1+" <br>"+" r* t/ \- l2 l: Z+ n( f* `: j
s2+" <br>"+ h1;
3 d8 {; ?4 C- W}
/ i4 ?0 g! \ j0 I# B |