|
[作者:扬州BCB]
7 G( \. K/ S' [4 y: u 一、 Cookie概述: + e- }6 F0 F% u4 b5 e; Y, @& C
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。6 b& {+ l+ H. |' Z" V
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
% w% ]( ]8 i! K2 g% a内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可7 m; y- I/ w: I* e7 x
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量2 \& v$ h5 T# T; F# i) k, Z! @
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次0 p4 `3 y! F; v/ S
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网* \. E# a4 x$ n7 x
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
* o+ |0 G. J# X/ t# M/ H$ t5 X小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
3 Y: B, T7 Y9 ?; x8 q) ?使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
! N" Z g+ O- A$ l 二、JavaScript脚本对Cookie变量的存取:
9 g8 H! K6 B, t) I% O' A: T JavaScript是运行在客户端的脚本程序,用它可将文本输入
6 `8 ~6 E; c4 X m. Y框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
+ F7 @: K" X9 _9 Z7 w微减轻Web服务器的一点负担:
7 C( Z1 E% c$ G- n5 i( Y 1>读出Cookie:2 v! K! h0 ^# t( z! Z- w. H
JavaScript中可通过document.cookie访问到所有Cookie:
$ G2 @4 F. M# b/ { "变量1=值1;变量2=值2;变量3=值3;"
j) G6 f) X3 K 需经过串分解就可得到每一个变量名及值;
) K4 _1 l, m! G 2>写Cookie:
% D* t/ Y. K2 } email="bush@usa.com";
; U% M5 C- c$ s firstname="jorge";
9 ^/ g( ?* {& i, ^$ i& | lastname="bush";
7 g: ?- z* C. Z6 U3 c" |: m2 F expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
* i3 \: G# m- M: g/ M% b ^ document.cookie="email="+email+";expires="+expireDate;' t3 h& w6 |7 o3 D/ h! |4 s: u
document.cookie="firstname="+firstname+";expires="+expireDate;
# o3 A+ K; Q7 F- O8 [. B document.cookie="lastname="+lastname+";expires="+expireDate; ' _4 k. d" u8 N# z
下页一例,将网页的文本输入框域变量NAME自动保存下来: ( R/ |; _: I; c6 x9 r
<script language="JavaScript">. \, v+ ~5 i; i2 V f
<!--
/ t5 X- ^7 w$ b- G" D1 @+ cfunction getValue(s,n) // 分解Cookie表达式s
! D A3 ^' v$ n0 i& ~{( H. P3 I' g7 s! j t( V
var pairs=s.split(";"); // 分解成串数组5 I$ B+ _( a" R. C4 y' H' X
for (var i=0;i<pairs.length;i++), N9 o& q; E5 ?$ U8 |. C0 Y: w
{3 ^% b: M3 m- q0 p( {
var pairSplit=pairs.split("=");
8 v; u# V2 ~) u8 l' i$ f# Y if (pairSplit[0]==n) file://查找n
" m: R6 c" L6 }; D j/ f return pairSplit[1]; file://取到n的值
* L: B% y( s s( f7 y } + ^ ?+ ~/ ]8 @1 ?, a7 b5 S7 ?. u6 d
return "";1 j: V8 v$ T9 s
}
& U X8 L/ W. sfunction getName() file://取Cookie中的姓名NAME1 N Z1 m4 A% z, @
{
/ B# A. \& c$ X7 `* H8 {4 G var s=document.cookie; // 取所保存的Cookie
7 @, \4 ~' h+ B- a* ` NAME0=getValue(s,"NAME");
) H. q. R! V, b$ V- r- e form1.NAME.value=NAME0;
6 R9 @* x% Y) m; h: l}
# V, }% A# G4 a* O8 W; s/ P2 wfunction newCookie() file://将Cookie中存姓名% E+ e5 h6 q! l
{
5 j3 }7 {) N q: r1 Q var s=form1.NAME.value;
- v! D% z0 a5 J7 N$ Y B if (s!="" && s!=NAME0) // 非空则保存3 q5 c$ c0 e7 k" A" X+ w( ?
{
* F% [2 Y: b; p- L1 G7 L/ {# R s="NAME="+s;
" D2 t& l7 p- J% i s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";' o, I G. _4 c) Z+ t" \8 e
document.cookie=s; // 将保存到客户机中. N1 O+ N( y: B1 D
}
3 ?$ x3 ^- [( y}& b0 t9 i. p% w: L$ H
file://--></script>
: d9 D9 \) v1 Q0 @..................
9 Q% I4 K4 k1 X/ C1 {3 Y+ y# Z<body bgcolor="#00FFFF" onload="getName();
: D+ h! V$ |( t I form1.TEXT.focus()" onunload="newCookie()">
0 t; [' Y. N6 }, M/ a' h/ Q8 |<!进入本网页时将执行onload中的getName()>
# |8 ?3 K$ _# x1 N F7 ]+ F7 Y. T( c<!退出本网页时将执行onunload中的newCookie()>
/ k1 n! e/ x+ i.................. 4 g9 c! M) S# f2 v+ m
三、BCB与Delphi中用ISAPI对Cookie的存取:! L1 b9 \* W) _
[注:Delphi用 .代替BCB的->] 6 z% \/ ` T5 p3 M
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,1 [& K% x, H5 |$ m. E
它也可以读取与存入Cookie变量:
5 F! Z; g3 x J 假设处理用户提交的方法如下:
- M0 o* _' q6 u2 [void __fastcall TWebModule1::WebModule1Action(TObject *Sender, - Y a* {$ q; {0 k+ P9 |- X
TWebRequest *Request, TWebResponse *Response, bool &Handled)
% E% l- E [4 r% K# R4 v$ E 1>从客户机中读取Cookie: 3 V3 Y- I) a# v$ Q( q
Request->CookieFields是个串数组TStrings *,如果不为
2 ~; R8 F3 Z8 ]4 z! i3 |4 g空,每一行都将是如下形式:
( K0 F( z! @. D7 ]' B Cookie变量名=值' p# B2 O4 W% x5 `$ H2 p7 D" O
共有Request->CookieFields->Count个变量,2 G$ n1 j/ t3 F/ s& x: }: H# }
变量名为Request->CookieFields->Names; (i>=0): h, t' o: p4 J7 }% D
Reauest->CookieFields->Values["变量名"]就是对应的值;
" s8 \! B% r& Z% P2 d请注意: 客户首次访问网页时,客户机中并不存在你将要设的
% I$ I3 ]$ v. a8 x z$ ]" WCookie变量,所以第一次Request->CookieFields将是空的; + L4 N4 |% U3 ]) T7 u% Y4 t
2>将Cookie变量保存客户机中:
, b/ J0 i+ q# \3 R/ w' [' P6 k TCookie *pNewCookie = Response->Cookies->Add();1 E& ?: m% O; f# P. a7 B
pNewCookie->Name="变量名1";$ V$ z; u$ z4 a1 \
pNewCookie->Value="值1";
2 L0 c! a" n# C0 j pNewCookie->Expires = Now()+366; // 保存一年
$ p4 E& P+ u2 J" F3 i. l就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
5 _# \8 B$ C8 j/ `3 N; ?* i举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
; k5 Z2 ?4 R Q. C- N.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
6 M) p& @; p. o5 V; {# Z9 ?void __fastcall TWebModule1::WebModule1WebActionItem1Action(; F" g8 r3 n$ @4 a2 g, f' s
TObject *Sender, TWebRequest *Request, TWebResponse *Response,7 Z& n; t/ l. I9 C3 Q1 V* A
bool &Handled)& |% u6 k( q, j' G" @& d' F* Z
{- o9 Q! m+ ^/ l+ Y# `" J
TStrings *cookies=Request->CookieFields;8 P, O6 F' }' i& l
String oldvalue1=cookies->Values["count1"]; // 取count1旧值7 V t1 g+ x/ u# \+ P
String oldvalue2=cookies->Values["count2"]; & i6 f' `) `) K/ T9 z. z% d
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
+ p# f6 m8 ~- \% x+ x String newvalue2=oldvalue2.ToIntDef(0)+100; ! @. Y' t, R' v2 r! |
TCookie *pNewCookie1 = Response->Cookies->Add();
7 s( q0 _: q9 d( ]" u0 T pNewCookie1->Name="count1"; file://更新Cookie# u5 M4 D7 x5 D! `- }& T0 o' q
pNewCookie1->Value=newvalue1;
, \2 o, y* {* q( } Q [ pNewCookie1->Expires = Now()+366; // 保存一年
0 d" _4 O9 r2 H, z" i0 m TCookie *pNewCookie2 = Response->Cookies->Add();
/ \: _) Z7 ^4 Y pNewCookie2->Name="count2"; file://更新Cookie
* [; W& Q( W) ?7 @' ~ pNewCookie2->Value=newvalue2; T' O& F" \8 S5 H
pNewCookie2->Expires = Now()+31; // 保存一月
. S' Y# S6 X/ Q% E // 向客户显示Cookie的值
3 |- N9 Y, A( D* e# j$ r String h0="<html><head></head><body>";
/ K. s! t! ^+ p2 H2 W4 b* t* y String h1="</body></html>";+ D6 _9 v+ y g0 q
String s1="计数值1="+newvalue1+"<br>";& o7 u Q& r, B" Z! i
String s2="计数值2="+newvalue2+"<br>";
" N" Q* \( G: V! U; @! E( t Response->Content=h0+s1+" <br>"+
6 A& _' b9 e [& a* | s2+" <br>"+ h1;2 H- m, D2 C6 Q% ?, m/ O
}
2 O; p" E9 m% y9 {: B% V# r |