|
[作者:扬州BCB] ! s- _5 ~ i; B |
一、 Cookie概述:
( M" ~) \4 G, N$ Y- U1 g" E/ Q 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
" M. ~* B+ J6 i0 t) L7 n6 A$ s Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
; K) g- u7 Q# J" Q& P内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
- j& i0 r; u$ n2 z5 s' }% q测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量- l- {. ~2 a X; a7 V5 m+ D
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
; H9 f+ n; `; }0 K% h所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网1 g: A- M- R/ C9 n7 m' `- F& |
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫+ u% d y& I& m! e' G! n
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,0 S3 }9 b9 w6 J9 a2 C: h+ Y
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; 9 g+ a, ^3 u2 K, s: w+ f# P
二、JavaScript脚本对Cookie变量的存取:
s7 p/ e. W4 [6 J0 d) L JavaScript是运行在客户端的脚本程序,用它可将文本输入
1 S% g# D1 \7 ]* F. o4 W6 f框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
- K3 M! ]) C" N0 G; z微减轻Web服务器的一点负担:
7 _4 g0 Y% X8 T, b$ P 1>读出Cookie:4 s: C' q5 Z0 `! ?9 D
JavaScript中可通过document.cookie访问到所有Cookie:5 B; ?) \/ i9 ?: H1 k o- N
"变量1=值1;变量2=值2;变量3=值3;"+ D) W: V0 \2 H6 k' D
需经过串分解就可得到每一个变量名及值;! V4 R: K4 h/ A( D% @4 ]7 o9 J
2>写Cookie:
( w- A# m, b, d* G8 o2 e* e2 d' q9 P email="bush@usa.com";+ n& e( S4 F3 k- h+ F
firstname="jorge";6 e) s8 K! C& n5 k" E" I5 {% ~$ m
lastname="bush";7 `% O S" k V6 p b1 T
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
- X9 k% [6 i$ \8 ^) L document.cookie="email="+email+";expires="+expireDate;
2 `( W! {' m+ V) J3 r$ k document.cookie="firstname="+firstname+";expires="+expireDate;
6 v) s. t& p5 u+ n* h& Z1 s* T* ] document.cookie="lastname="+lastname+";expires="+expireDate; 6 H/ x: M* t# ]5 a/ ^* a- |
下页一例,将网页的文本输入框域变量NAME自动保存下来:
; M: ]. i4 [* a% [& h( p<script language="JavaScript">
4 ^% e/ m2 Y: |<!--
5 v/ ]5 l' U. L" `) A# P8 Zfunction getValue(s,n) // 分解Cookie表达式s
$ G) {; {8 ?; Y9 P& ^ B{
3 @0 c* r: T6 r1 ?6 q var pairs=s.split(";"); // 分解成串数组
- m# ^3 r w# R0 [ for (var i=0;i<pairs.length;i++)
( }4 O! n* S& `: }) N' S {
; u/ G% E& v/ Y8 E% V/ d var pairSplit=pairs.split("=");
7 _$ f0 x& G# x3 | if (pairSplit[0]==n) file://查找n" j+ S9 T, Z* F/ K% l
return pairSplit[1]; file://取到n的值
* X4 b. ?$ b7 k* q } - \6 Q5 ?, I8 @' y" I8 ~
return "";% {# N5 L, J6 J+ h
}4 L% i9 k7 c v
function getName() file://取Cookie中的姓名NAME
# q+ ?) n' {8 o L{
+ q- `! @# l: C* L* h4 y var s=document.cookie; // 取所保存的Cookie
6 G1 o9 j( m) ~" o6 b2 P NAME0=getValue(s,"NAME");
8 a7 Y/ |9 T+ ]& Y1 C form1.NAME.value=NAME0;$ Z& p% r# A3 @) h
}& z- D5 R: k& @# g- `# c
function newCookie() file://将Cookie中存姓名
" a! i* N* R1 w{
0 Z. e. l1 A; i+ @. R9 J var s=form1.NAME.value;0 b. T* b7 ] e0 n `# [
if (s!="" && s!=NAME0) // 非空则保存
* {( T$ x B+ F+ m) o) t- t {: ^5 i+ Z) }. x, M/ |0 X$ a
s="NAME="+s;
+ ^# U! @ n% A3 j* O9 m s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
, I: ]. h( p6 y- @ document.cookie=s; // 将保存到客户机中0 r$ j2 X6 t- b3 w+ O- g( \
}
+ G- z, }* s+ ^+ f8 E/ `/ w}
. `# S+ ]1 E' e5 R; wfile://--></script>/ \0 |1 t2 _* x+ g; d2 l+ R
..................
6 B3 ?( N- e- w0 C<body bgcolor="#00FFFF" onload="getName();
8 J5 d1 w( k! s/ N form1.TEXT.focus()" onunload="newCookie()">
/ W) B. j3 n) _3 l g# j<!进入本网页时将执行onload中的getName()>) i7 a! j/ E! ^! |5 ?1 ~) j2 B( O
<!退出本网页时将执行onunload中的newCookie()>
$ U! \+ |- Z3 m+ E% j# h: _..................
! P J% d0 {( t) j 三、BCB与Delphi中用ISAPI对Cookie的存取:
* L8 l& e% e d, N/ j8 G [注:Delphi用 .代替BCB的->] * i: p/ ~9 t/ _4 H$ y
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,. _) }2 J+ B1 B& @+ m
它也可以读取与存入Cookie变量:
, @1 r9 n9 L' u, W. |& o 假设处理用户提交的方法如下: 2 @9 H, I( O$ _6 u. ^ F
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
- ?6 C2 U z9 t* q' O/ Y8 UTWebRequest *Request, TWebResponse *Response, bool &Handled) 6 @" g# ^ \5 F( \/ s8 S" p' z* M, O
1>从客户机中读取Cookie:
( m! M, n2 |& i+ O/ z) b; }2 U Request->CookieFields是个串数组TStrings *,如果不为; Q- s) a+ T4 B, d5 [0 @6 I. ~* b5 a
空,每一行都将是如下形式:( ] [' j5 N5 z; s1 K7 I* E& ?2 K
Cookie变量名=值3 r6 t7 u2 h# z
共有Request->CookieFields->Count个变量,
0 d' w7 V0 G# ~ B, ]: u# O变量名为Request->CookieFields->Names; (i>=0)
6 y/ B* K k- q7 N- R6 ?Reauest->CookieFields->Values["变量名"]就是对应的值;# m) r# g3 s& z: c% f; t* K; p
请注意: 客户首次访问网页时,客户机中并不存在你将要设的) N- |' Z# V( S' S
Cookie变量,所以第一次Request->CookieFields将是空的;
O9 C- R- f9 M; S 2>将Cookie变量保存客户机中:2 a, C- j' V2 h8 g/ @% H; Q
TCookie *pNewCookie = Response->Cookies->Add();9 O/ w5 e9 \9 \, P- X8 |" I) S5 G# U
pNewCookie->Name="变量名1";4 |8 q0 ?$ ~1 H# V5 b, `2 x
pNewCookie->Value="值1";
2 L1 ?6 P7 c* \8 F pNewCookie->Expires = Now()+366; // 保存一年2 s( u& q4 \1 v t: J
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; . U, O5 F/ }+ i9 u) w: ]
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
7 r! J+ I9 p5 x% C' @' L, K; J.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
$ l( J. u! F0 rvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
7 l7 Y' B0 p) N% k$ A TObject *Sender, TWebRequest *Request, TWebResponse *Response,2 R0 G: f$ q# U
bool &Handled)/ I6 M9 m5 E B$ u
{ C! N+ M1 Z. E. _5 O# I
TStrings *cookies=Request->CookieFields;
. Q0 _- I; C# a; L3 Y String oldvalue1=cookies->Values["count1"]; // 取count1旧值8 }* R1 [! t9 G" n
String oldvalue2=cookies->Values["count2"]; & _/ F; c; o. G: G
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
& y: k; e5 r7 q8 a String newvalue2=oldvalue2.ToIntDef(0)+100;
0 ]% c% }; M1 `6 R TCookie *pNewCookie1 = Response->Cookies->Add();# ~$ f! m' G* n9 \5 J4 `: R4 ~
pNewCookie1->Name="count1"; file://更新Cookie! J1 x9 H/ M+ |& G3 D3 V! r# r
pNewCookie1->Value=newvalue1;
# d7 X/ k7 v/ ?& r) P p pNewCookie1->Expires = Now()+366; // 保存一年
7 {/ t3 d0 n1 c- C8 O# [# B TCookie *pNewCookie2 = Response->Cookies->Add();% U) e7 s4 z8 J& E
pNewCookie2->Name="count2"; file://更新Cookie
& g& |% x1 r3 S. | pNewCookie2->Value=newvalue2;+ R' Z# G4 o& G4 n
pNewCookie2->Expires = Now()+31; // 保存一月
, j% L) w" s5 u! l7 L$ N // 向客户显示Cookie的值
$ _3 y: g! U, g: C' L String h0="<html><head></head><body>";
+ N! e) O+ p; Q- U- w String h1="</body></html>";! \8 @* N: S) k4 f" l
String s1="计数值1="+newvalue1+"<br>";
$ S3 w3 }4 E. I0 d String s2="计数值2="+newvalue2+"<br>";
. I' n. j/ C( o1 k Response->Content=h0+s1+" <br>"+/ [9 g! m7 x+ E+ X
s2+" <br>"+ h1;
$ A% u8 T. I( X}
+ V; N' k3 [2 s) G1 Z |