|
[作者:扬州BCB]
7 a4 f+ Z5 U2 P9 ?6 | 一、 Cookie概述:
4 u/ m& h! y. H, N& b8 G 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。! H1 ?& b4 I' k: O4 Y: V7 [* U
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
6 {/ w& ~2 i7 D. ^) p0 ~6 S7 h6 ]内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可) b" `: r& u5 Y8 W/ B% [7 R+ Y
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
, U% M+ }; ^9 D" @! F: |- M的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次* n+ t& A; |+ D5 B# K i7 B
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
! I6 j/ a" K$ }/ p' A8 @. k页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
2 b, g9 y1 b) E ~1 c4 p& _4 P小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,& f; L# ~7 M. o" y1 L- [9 Q
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; 4 A& \$ {. R# m( O9 g
二、JavaScript脚本对Cookie变量的存取:
% v8 x, G: f8 v: M. ^$ b8 ] JavaScript是运行在客户端的脚本程序,用它可将文本输入
: q, U" X7 z' @( P( |# U框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
: L) z. h* @1 T7 {* q$ j- ^3 ~微减轻Web服务器的一点负担:
4 x; q" e& f* {) o 1>读出Cookie:
4 Q' E8 n/ E/ _" ^) o' |4 s JavaScript中可通过document.cookie访问到所有Cookie:
& |" f+ [- K. w5 I, u6 X4 J% u- S "变量1=值1;变量2=值2;变量3=值3;"8 h) t2 v! T1 Z) k2 M! o0 y8 z
需经过串分解就可得到每一个变量名及值;; c- [+ s5 [" e3 X8 k
2>写Cookie:
( }& u4 h$ S6 L$ u- w. R% o email="bush@usa.com";
0 g. R( q$ d) Z s- w, r$ ]% m firstname="jorge";
8 H( r: ~! E ~9 B9 j% e lastname="bush";
6 x) v4 x0 {( z5 e H+ L expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
. J, D% K3 E( O2 z: ~! @ B: G0 x/ R document.cookie="email="+email+";expires="+expireDate;
; S" S7 H t9 e6 @% V9 w document.cookie="firstname="+firstname+";expires="+expireDate;
9 v$ c5 i# c0 {3 u5 A6 U/ X8 u- H document.cookie="lastname="+lastname+";expires="+expireDate;
. {0 Q% ^- z, E2 s' X' W 下页一例,将网页的文本输入框域变量NAME自动保存下来: & J9 N8 h! U. B# w0 _8 h
<script language="JavaScript">; [4 _6 @$ Z$ K$ l
<!--
/ D, @* j: @: dfunction getValue(s,n) // 分解Cookie表达式s
/ D7 N( y! u( O1 \% D: R{; H* r3 T" ?- G; F! t8 F9 c) K2 h
var pairs=s.split(";"); // 分解成串数组' H) ]0 s! T; b$ a( l
for (var i=0;i<pairs.length;i++). s8 h! H8 }' g
{1 R" [# r$ T8 w! B( A! K2 g4 A
var pairSplit=pairs.split("=");. T# A; D0 V' U y
if (pairSplit[0]==n) file://查找n
9 m: P# c. c- [ return pairSplit[1]; file://取到n的值6 z3 R/ `: Q( m' Y: b
} ' G/ W' d) E9 V& O
return "";( V1 x( u1 c! w, _: i
}. u. w/ s# [ v! j3 Q! B
function getName() file://取Cookie中的姓名NAME
( ]6 w9 i3 k% o J3 z( r* ]{
, |& |1 k& i6 u9 H+ f. M1 b/ s/ I var s=document.cookie; // 取所保存的Cookie
( |! i" C% \1 ]% E2 d9 ]( ^, x NAME0=getValue(s,"NAME");
' P ?, V- J) m: g5 C1 X, I: j form1.NAME.value=NAME0;2 y$ M1 t' R c+ |
}) e0 u# M0 H) z9 E
function newCookie() file://将Cookie中存姓名
* }; j5 e. e, H C! T" F2 E{
, T( ^% X% _; ^* J! X: J var s=form1.NAME.value;
2 _! Y' \" w! z* D- X3 i if (s!="" && s!=NAME0) // 非空则保存
+ h( `7 w% U% Y6 h \ {
7 t% I% W5 F! c0 e4 ~) Y3 i s="NAME="+s;
6 U$ `: M" \# d/ }; [ s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";) ^, M2 q, h1 Q- W5 U( r- s9 l
document.cookie=s; // 将保存到客户机中7 N! Y; _/ u0 o0 X; v
}
3 D( [! H% S- D" j; c ^}# m6 j1 m$ k% y! D' v6 ?6 P* _; b
file://--></script>
, {$ |7 e* ?) O w.................. ! @+ x( f: x- M# r8 _0 a
<body bgcolor="#00FFFF" onload="getName();
$ N3 E! l, ]" u* j form1.TEXT.focus()" onunload="newCookie()">6 `" ]- o" Q/ n% S# Y. G& u
<!进入本网页时将执行onload中的getName()>
+ n% s6 F* M5 a9 l1 z6 L4 ]<!退出本网页时将执行onunload中的newCookie()>
4 |( h2 ~/ T; S3 x7 `" a: J.................. , `( K9 B |7 L2 f+ B- Q
三、BCB与Delphi中用ISAPI对Cookie的存取:
3 m9 L4 K; @+ ~$ i* X5 s! p; P [注:Delphi用 .代替BCB的->]
7 }; D% Y) |% l 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
( k) |; W# f, s% ?5 U$ e它也可以读取与存入Cookie变量:
- x7 q. v; |+ D% B; c; ^ 假设处理用户提交的方法如下: ( j, t. `: c+ ?. L/ A0 t
void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 1 C8 t i! w( i, x8 a9 F
TWebRequest *Request, TWebResponse *Response, bool &Handled)
1 Z0 M) U h9 f/ g. h( L" I 1>从客户机中读取Cookie:
, {0 i# d, [5 e0 G! O Request->CookieFields是个串数组TStrings *,如果不为9 g, S, P4 b, m
空,每一行都将是如下形式:
9 N9 a2 F$ ~. G* l1 R' x Cookie变量名=值
9 A9 c$ f1 }& q; i0 U& d% `: f5 `! }6 E共有Request->CookieFields->Count个变量,
& H8 h) Y" g- A2 x变量名为Request->CookieFields->Names; (i>=0)
3 ~. R4 n M& ^- {& T3 Z* L# L; s0 nReauest->CookieFields->Values["变量名"]就是对应的值;
* O1 j# ^" P# p* c请注意: 客户首次访问网页时,客户机中并不存在你将要设的
3 a, T4 m. ? }: x r+ mCookie变量,所以第一次Request->CookieFields将是空的; 8 A! m2 S4 ^( ?" P; ~
2>将Cookie变量保存客户机中:
1 g; P# |/ ]4 Q TCookie *pNewCookie = Response->Cookies->Add();
}! o7 m" }4 B7 a& w. D: { pNewCookie->Name="变量名1";
+ m# I* |4 M& x5 I3 E pNewCookie->Value="值1";, z7 L2 L5 N+ q! Z6 I# h
pNewCookie->Expires = Now()+366; // 保存一年
2 @1 Y) d' X- w& T [就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
( r6 f8 F9 G' `+ R# C7 ]6 |举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
/ B& A5 b3 I5 _ X.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
3 z! X: p& k. x7 yvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
5 q: f9 U# X+ S( e TObject *Sender, TWebRequest *Request, TWebResponse *Response,- b* L8 a3 F) p% I% k6 Y) _
bool &Handled)- y% n1 \$ s. ^5 X+ u8 `' v
{
* _3 F6 ~+ y0 c TStrings *cookies=Request->CookieFields;" X. a* V5 ^# y; ?2 @
String oldvalue1=cookies->Values["count1"]; // 取count1旧值
: M! x; @5 P. B; c& A% O String oldvalue2=cookies->Values["count2"]; : T, U5 u9 l/ o/ K
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
& |! v; v/ ?( @2 F5 y5 F* p String newvalue2=oldvalue2.ToIntDef(0)+100;
5 g2 Z8 v/ S# r+ Z: i TCookie *pNewCookie1 = Response->Cookies->Add();3 _9 P" D4 G1 f
pNewCookie1->Name="count1"; file://更新Cookie
3 z9 W6 t0 U6 l1 I pNewCookie1->Value=newvalue1;
% u% P# B7 c% B% ` pNewCookie1->Expires = Now()+366; // 保存一年
8 l/ ?# O* f# g TCookie *pNewCookie2 = Response->Cookies->Add();' V$ i$ G* l8 R. p3 ]% C
pNewCookie2->Name="count2"; file://更新Cookie
5 _$ c, A' V; X1 c @+ ]1 i+ h1 x( O pNewCookie2->Value=newvalue2;
6 ~5 }3 S8 y i; Y9 u pNewCookie2->Expires = Now()+31; // 保存一月 & b& W# I) [ ]! M/ I1 v
// 向客户显示Cookie的值
; m) K+ a, C# r String h0="<html><head></head><body>";: s4 J6 G( |! H) [$ ^- o% S
String h1="</body></html>";2 H; o* A6 W6 T: \0 t/ K- c e
String s1="计数值1="+newvalue1+"<br>";- A+ V7 I* ?( k0 ?5 p, B
String s2="计数值2="+newvalue2+"<br>";
$ n; Q* _/ E. T3 s" | Response->Content=h0+s1+" <br>"+
8 |( T4 q) }9 R& e( T s2+" <br>"+ h1;/ {5 V% E0 ^7 M# d! L
} + j- [" ^8 f& k
|