|
[作者:扬州BCB]
5 N; e+ a& `3 D& \$ E& D 一、 Cookie概述: - a1 K" C. \4 K5 S
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
( W2 C% R" A; r, n5 Z) A& c: H Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
# v( V" r$ I5 \! O内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
S" k0 z; p" z% Q( r! s- D测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量. p8 n$ N2 ~2 Z$ y, o. L
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
% ?7 B4 H4 `7 k6 ~1 U6 d' ]* y所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
; _0 }0 i' Y* G4 f页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫- Y0 [- M6 I8 p! u" f
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,! w8 B" A) M9 G3 x
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
) t5 ]( @* l6 C# i# ]* \& \; Q 二、JavaScript脚本对Cookie变量的存取:, K5 z5 j8 s6 S$ m0 {* V- c& H7 N
JavaScript是运行在客户端的脚本程序,用它可将文本输入+ e* M; O7 G# ^% g& i
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍1 A2 S+ E2 {) N, g* P. U3 ~& f7 B7 H& O
微减轻Web服务器的一点负担: 4 }/ i% B- p5 A) R8 F0 ]% L
1>读出Cookie:5 e4 Y1 U& X' c& P8 `
JavaScript中可通过document.cookie访问到所有Cookie:
% ` X; z# i* m1 n9 h "变量1=值1;变量2=值2;变量3=值3;"5 I1 N7 l# R+ I1 A7 T% h
需经过串分解就可得到每一个变量名及值;
: `+ I2 X/ T2 t8 i" c" s1 Y8 o 2>写Cookie:# u& }, |6 R! e1 U j7 ]
email="bush@usa.com";
6 r. M P. t& K# ?/ k" P8 A& l4 c firstname="jorge";3 C4 l$ u2 p6 g; \/ y
lastname="bush";
& B0 D( s. }% K! \" o0 X expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
+ y: \, X! r5 D S- n C document.cookie="email="+email+";expires="+expireDate;; A* |( o8 M" H4 Z$ B; {3 P
document.cookie="firstname="+firstname+";expires="+expireDate;
" o/ H) b7 M' \: b+ V% } document.cookie="lastname="+lastname+";expires="+expireDate;
/ Q6 D% r$ N( S0 E* [5 D1 i 下页一例,将网页的文本输入框域变量NAME自动保存下来:
( q9 p( T1 g# d* G/ O0 }<script language="JavaScript">) m9 l$ N6 K1 G/ U/ ]
<!--9 O3 J! u0 g/ Q3 W' O, z9 t
function getValue(s,n) // 分解Cookie表达式s
2 G; X' c8 N) ~$ Q3 x{) h3 ?: @# o- N% ]1 I- ^
var pairs=s.split(";"); // 分解成串数组
+ n( Z- Y& f* C for (var i=0;i<pairs.length;i++)
. b" r& p3 [2 f$ H3 v3 y3 | {
8 V$ { {5 j% h/ k8 T var pairSplit=pairs.split("=");9 I2 L' `& f" O8 _
if (pairSplit[0]==n) file://查找n N; ?8 U2 Q: M/ B( l, ]
return pairSplit[1]; file://取到n的值, a. g- T/ p: u1 B& w+ }* Y
} ' ?3 x2 B4 g6 |
return "";
6 ~+ G6 S6 f8 F$ [}
) o% M$ u H& q1 @# Efunction getName() file://取Cookie中的姓名NAME
: e! h2 a4 R. g! b+ h" Y{
# i/ _3 O. n( y; C0 I! I var s=document.cookie; // 取所保存的Cookie
& R4 J: ^: x& u( M' @5 H5 I NAME0=getValue(s,"NAME");2 O3 k4 o. g1 C
form1.NAME.value=NAME0;& x' [$ N- D1 W6 R" g
}/ W) v Y9 t' ]1 }' P. \
function newCookie() file://将Cookie中存姓名% j* ^( i3 f" \5 A- a
{$ c: \! U& k0 m6 O$ t# F$ M
var s=form1.NAME.value;
1 R( m) @& M5 d% H: N- B if (s!="" && s!=NAME0) // 非空则保存
0 G6 U- Q$ R; w$ y2 ^, m) y {3 ] x8 {- l% {; V
s="NAME="+s;( x# S) O( E" ~1 ` Y6 s* Y0 n' \
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";- x2 y l! G3 C7 x/ }
document.cookie=s; // 将保存到客户机中$ o* ~& D1 m/ C" C2 Q; e
} , ?! I/ F; w' G; [
}
' d" E' L2 N; M! d% Q- i+ Dfile://--></script>' r9 M4 E* N$ L3 p3 ?
..................
1 h1 g; p4 @4 V: Z) B" a<body bgcolor="#00FFFF" onload="getName();
( b: h5 q* Q' M4 X: S5 j form1.TEXT.focus()" onunload="newCookie()">
/ S0 w) Q6 X; ?. y5 { Z- v% ^<!进入本网页时将执行onload中的getName()># h1 E7 J1 R' r
<!退出本网页时将执行onunload中的newCookie()>8 d3 R% Q) p: ?2 u
..................
1 V* g- |( N" p# Y4 `& V 三、BCB与Delphi中用ISAPI对Cookie的存取:
' e* T0 m! h. ?' h) n$ K7 i [注:Delphi用 .代替BCB的->]
- O5 c! V8 b! Z9 @ B+ N 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,+ Y; V$ g( W7 f' N {" x
它也可以读取与存入Cookie变量: 3 W4 M h ~, h( l
假设处理用户提交的方法如下:
! s |; T2 }; e; e5 i8 d1 D7 wvoid __fastcall TWebModule1::WebModule1Action(TObject *Sender,
. j6 r* f; R+ q$ P( r+ j) W4 J' B6 DTWebRequest *Request, TWebResponse *Response, bool &Handled)
: \# L0 ~7 b9 |& s4 y- j! { 1>从客户机中读取Cookie:
: A, y; x* \( j7 N- a Request->CookieFields是个串数组TStrings *,如果不为
$ S! a# m5 ]1 U- |6 V; e! p空,每一行都将是如下形式:3 s4 y' m+ t' X+ z# a+ k
Cookie变量名=值
$ P! K: A! _2 `- v! u) a) N: s# b共有Request->CookieFields->Count个变量,
5 T/ Q+ j! @6 _4 v+ S. `变量名为Request->CookieFields->Names; (i>=0)
( U$ f! N$ @2 @) DReauest->CookieFields->Values["变量名"]就是对应的值;
3 ?3 B* V/ l, |# p# I请注意: 客户首次访问网页时,客户机中并不存在你将要设的
# ?# l8 `$ P$ UCookie变量,所以第一次Request->CookieFields将是空的; * X6 F5 T' N1 ?( ]4 {4 x
2>将Cookie变量保存客户机中:8 G) d7 a$ V. Y! K: A# I
TCookie *pNewCookie = Response->Cookies->Add();
3 ]: |( M# e- r, Q8 ~ pNewCookie->Name="变量名1";
1 u5 G+ i: x) Y, P/ i8 n pNewCookie->Value="值1";
; z- T$ v* p5 |& L- g pNewCookie->Expires = Now()+366; // 保存一年
! U |+ T( f8 O$ J就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; 9 I/ R; J) ^4 m$ p) Z* z/ c# b' q
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
$ N$ y t2 h* U; n& k( X( h& K6 N.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
' ?. f( u4 I& e/ q- V# t; o% ivoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
. N/ F0 o6 S0 m* |) t/ h) p TObject *Sender, TWebRequest *Request, TWebResponse *Response,7 K# T! L4 p* y" p& z* Y' ]3 @
bool &Handled)
2 U/ e. d( c/ B$ e2 Z4 g: @{+ t! p" } h' I& g' P
TStrings *cookies=Request->CookieFields;' |5 i! s* [9 n7 c& u& ?3 w
String oldvalue1=cookies->Values["count1"]; // 取count1旧值- `- H, i) [8 Y X. p8 G* w+ n' D
String oldvalue2=cookies->Values["count2"]; * i7 q3 `, X8 J( A
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
6 x n T/ U* X% E" h String newvalue2=oldvalue2.ToIntDef(0)+100; . ^/ P, ~; j0 m% ~ i
TCookie *pNewCookie1 = Response->Cookies->Add();
1 @) G. S% s+ ~2 Q! N pNewCookie1->Name="count1"; file://更新Cookie
* a- C7 X: v+ j( Q3 Z pNewCookie1->Value=newvalue1;. C2 j* N! N9 t* N7 w: u
pNewCookie1->Expires = Now()+366; // 保存一年
( j# u7 ^% Z8 Y8 O2 o% | TCookie *pNewCookie2 = Response->Cookies->Add();4 h8 p2 j+ j, T
pNewCookie2->Name="count2"; file://更新Cookie
3 S$ x2 r8 `0 l- K Q# { pNewCookie2->Value=newvalue2;: u! {' A5 ?2 } b$ x ~
pNewCookie2->Expires = Now()+31; // 保存一月 % B4 {( H) `# b1 o7 p; f9 `
// 向客户显示Cookie的值+ d! X; N9 Q) G3 L- Y
String h0="<html><head></head><body>";
% G6 r' e9 C2 }4 O+ g: }: N String h1="</body></html>";
# c) Z7 i/ Y! C( ~ H String s1="计数值1="+newvalue1+"<br>";7 t- u; [% y* a3 I
String s2="计数值2="+newvalue2+"<br>"; : }9 u1 q4 j: w% B1 X
Response->Content=h0+s1+" <br>"+
5 v- B+ I. }" F& P0 m$ s s2+" <br>"+ h1;6 M0 ?* q3 _) k) D5 n3 w/ U+ w
}
6 n8 d6 I% {! b- c) A6 f! n |