|
[作者:扬州BCB] 0 r6 W0 d& |6 U* I9 y/ N
一、 Cookie概述:
# v& t+ \ a4 ^8 L 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。: z. E) K2 F+ m+ I
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
6 N! I9 s ]) i$ N! k8 {: L% a" d内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可- i1 j/ Q' S) n6 ]4 y3 P9 N
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
/ f" U6 X/ A8 a- ~" e的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
2 Y2 b* Z* @5 k& e5 F2 [, k所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
+ }: \' o$ @- C! Q页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
' [. t" ]* n% C+ H) B小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
7 b9 r! R _! _) E @: {. |, w使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; / A0 U/ N, j# e M1 r$ v3 U2 ?
二、JavaScript脚本对Cookie变量的存取:
0 [* R- q4 t+ n/ r) R: h JavaScript是运行在客户端的脚本程序,用它可将文本输入
: J/ B$ M, ?' I: t' \. x" g6 G D2 f! x框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍( K5 M& Q9 y# @( K
微减轻Web服务器的一点负担: # h) g8 t6 | q* e4 V
1>读出Cookie:; Q3 s B6 f5 u1 p3 G2 T$ b
JavaScript中可通过document.cookie访问到所有Cookie:' E$ Z& | z, t. m7 X2 i$ U+ u
"变量1=值1;变量2=值2;变量3=值3;"
) l( X" p. q# ~# }! |$ h/ T8 p6 B. U 需经过串分解就可得到每一个变量名及值;
. Y0 y/ r$ U, `( ~ u8 ? 2>写Cookie:! y7 d9 n- c. _' ]9 _
email="bush@usa.com";: s- d( C5 q5 o) P
firstname="jorge";
" x3 |1 G$ B/ W$ M lastname="bush";
- ^- }0 O, S" k1 c* Y expireDate="Thursday,01-Jan-2099 12:00:00 GMT";% {5 J$ B9 `* N0 p) h* |5 f: P
document.cookie="email="+email+";expires="+expireDate;$ N* k; d5 o! n; b, N( ~
document.cookie="firstname="+firstname+";expires="+expireDate;
% g- ]* [6 e3 H, l* k& r; X3 E document.cookie="lastname="+lastname+";expires="+expireDate;
- H6 K' K' f% O- H0 h3 `6 ^ 下页一例,将网页的文本输入框域变量NAME自动保存下来:
+ T/ o: y: W& `8 a: c' _) i<script language="JavaScript">
% m% H- k% V* Y9 }3 \. I* ^<!--/ I' w3 d- @( u
function getValue(s,n) // 分解Cookie表达式s, E6 o, N8 _) i
{
% s; e7 x& T1 o4 ? var pairs=s.split(";"); // 分解成串数组. g: N9 S. m+ n6 R8 N: k
for (var i=0;i<pairs.length;i++)
5 p+ C e$ u8 G {
9 Z. i( F' k( y$ N var pairSplit=pairs.split("=");3 H( [( K, v! n, [# J3 Q
if (pairSplit[0]==n) file://查找n
: w7 n3 g4 H/ ]' {7 c" @2 O( D return pairSplit[1]; file://取到n的值; w; r6 A! p$ S) i5 S
}
( E5 S& x K- a1 c return "";
" _7 G" X/ x. C- J$ S& S2 L}1 T/ F% F G1 O/ Z% h
function getName() file://取Cookie中的姓名NAME' Q+ k9 E7 Y- r& \9 z8 c
{
( [$ c9 U( T* L9 E; q var s=document.cookie; // 取所保存的Cookie* _+ K d) r! O7 s r: i
NAME0=getValue(s,"NAME");
) \6 v8 Q4 e: @( [( f form1.NAME.value=NAME0;' M0 `9 ]: t& X q* D
}$ u7 @, m. m% Q! w5 }: L+ {
function newCookie() file://将Cookie中存姓名* i/ r: w: L) f" J# z' _' U. V
{5 ]; H% D; Q- G0 ]4 ]( ]! g# p$ [
var s=form1.NAME.value;
7 w( U l- K% ~5 v n4 f& P if (s!="" && s!=NAME0) // 非空则保存" |" N' J/ n- W, a
{
: p; Y1 D$ K" `/ ~6 `% Z( O; a s="NAME="+s;' Y% B6 j; A" W* k
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
6 k, C0 l- Q- f5 n3 N# [$ I# { document.cookie=s; // 将保存到客户机中) b. E; ~& V6 Q: D& Y7 @
}
$ m+ n5 A1 H7 j}
, `6 C2 ]' O* r5 ?8 zfile://--></script>& z4 K& B8 J: E
..................
6 y0 S# N8 I. \. w' A$ J: {! @<body bgcolor="#00FFFF" onload="getName();7 K5 F. m4 X' _5 H+ v
form1.TEXT.focus()" onunload="newCookie()">
3 v, x; |/ E2 G; J6 d<!进入本网页时将执行onload中的getName()>, e* v r: o' j: T( B( }
<!退出本网页时将执行onunload中的newCookie()>
; ?; B; k* j) R4 s8 S4 q" [/ l.................. : j' |& G; ?( _4 @3 G
三、BCB与Delphi中用ISAPI对Cookie的存取:% j& L2 i" [, h8 u4 G
[注:Delphi用 .代替BCB的->]
7 t) g: [# x. X" U4 j 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,$ }& u& k$ s$ j$ }; }0 l. K
它也可以读取与存入Cookie变量:
5 F, ?8 a5 z0 `- h( c 假设处理用户提交的方法如下:
9 w" z6 Z1 m+ X( bvoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, 6 g, e( {4 c3 o) q# A& J" P D
TWebRequest *Request, TWebResponse *Response, bool &Handled)
; |. g5 ]" t* ^' E3 T4 c 1>从客户机中读取Cookie: 8 j& Z( D1 s4 i1 r! ?
Request->CookieFields是个串数组TStrings *,如果不为" l2 \4 O# d/ a) g/ a P) }1 _9 J
空,每一行都将是如下形式:, I) ^+ n4 G& j9 ?3 o6 R) e. t# b
Cookie变量名=值
8 Z& p* Q' _4 E, n& W共有Request->CookieFields->Count个变量,
$ K4 U; K8 C8 N变量名为Request->CookieFields->Names; (i>=0)# D! T4 Y6 |' Y
Reauest->CookieFields->Values["变量名"]就是对应的值;
3 H9 }. X' {* G8 X0 S请注意: 客户首次访问网页时,客户机中并不存在你将要设的
1 ?! e8 x; d& G( |, _; Q6 S; f. ]$ ?Cookie变量,所以第一次Request->CookieFields将是空的;
. o: P4 Q. U) v b8 X2 N 2>将Cookie变量保存客户机中:# {3 b4 s0 V2 c) [9 v) i! v% P
TCookie *pNewCookie = Response->Cookies->Add();
/ T7 S2 I+ K$ |) e3 U. v pNewCookie->Name="变量名1";4 h4 C8 R: m# X) `# i. D* `
pNewCookie->Value="值1";9 J9 p" h! b# S9 O2 m
pNewCookie->Expires = Now()+366; // 保存一年
, z* X4 t0 _) r' u5 J就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
+ L9 g, A5 q4 q" r举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
0 @" j& V* h8 i5 ?.DLL后,每刷新一次浏览器,将看到计数值将变化一次: S# h/ C: {( w: g
void __fastcall TWebModule1::WebModule1WebActionItem1Action(
6 j+ x0 a `, k! \& U' Z( | TObject *Sender, TWebRequest *Request, TWebResponse *Response,
# y C' ~2 _5 M bool &Handled)
& |6 g! n5 C; K7 i7 Q{2 Y) O$ x+ p& k( K1 H
TStrings *cookies=Request->CookieFields;
6 o& j8 c0 S4 |5 y8 Y8 k6 W6 p String oldvalue1=cookies->Values["count1"]; // 取count1旧值
1 t/ \6 ]7 w2 k String oldvalue2=cookies->Values["count2"]; & p# o# e8 X8 E& X+ t5 @- u5 X
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
# `: g8 @ Q" f+ A String newvalue2=oldvalue2.ToIntDef(0)+100; % ~7 Z! }4 o' ?
TCookie *pNewCookie1 = Response->Cookies->Add();
7 q" i, \: y! K) F pNewCookie1->Name="count1"; file://更新Cookie
3 t8 z7 W: k, I0 W9 b8 a pNewCookie1->Value=newvalue1;
L6 \8 I& n' g. _" `! D pNewCookie1->Expires = Now()+366; // 保存一年 ; w0 V/ r0 J: O5 v7 }. |+ {
TCookie *pNewCookie2 = Response->Cookies->Add();- i. A8 m2 ]/ y, `$ Q2 O
pNewCookie2->Name="count2"; file://更新Cookie * N2 x) y7 }, x7 K1 E
pNewCookie2->Value=newvalue2;1 b1 I) t' Z' T9 Y- P
pNewCookie2->Expires = Now()+31; // 保存一月 ! I' r( C$ H1 t( m _9 g
// 向客户显示Cookie的值+ [3 f( k/ a/ ?, e. ^. ?: G
String h0="<html><head></head><body>";
9 o5 Y5 A2 u# [ String h1="</body></html>";" D* ~3 B1 r+ C
String s1="计数值1="+newvalue1+"<br>";( d6 m2 M# u/ _" U' m
String s2="计数值2="+newvalue2+"<br>";
- A2 ~' f, k* ?9 z9 ^ Response->Content=h0+s1+" <br>"+
4 M: X, C( l( d9 _# G5 g s2+" <br>"+ h1;
6 }% ]- t9 I& x& }}
3 z4 x* g! `6 X! ~ |