|
[作者:扬州BCB] 5 G/ ^/ A$ \5 m9 x4 W
一、 Cookie概述: 6 Y6 d/ @/ t5 S
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
/ i, g) Z; q- B* Y$ g- P Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机5 @2 v3 ?6 f! W& z/ |
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
7 e# u" |6 @% v: _* I- Q测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
+ P2 u+ [) v4 N* ?& b的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次- F9 w' T& G4 l* b) b& v6 L
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网6 @, I9 B" y3 ?
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
! w$ e2 ^$ m- B3 {) w. d小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
7 h1 I- I2 S7 e6 g. g8 ?使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
& k1 I$ Z6 Z% F; E 二、JavaScript脚本对Cookie变量的存取:
8 l @% {' H8 Y* X6 ^) v. j- h JavaScript是运行在客户端的脚本程序,用它可将文本输入1 z0 s/ Q) p9 a- g6 w" d& W- y
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍5 ^( `; c- X) a0 y! ^
微减轻Web服务器的一点负担: 2 ?$ k9 F- o3 @( ?
1>读出Cookie:
# y; ]3 b k, P; u! T JavaScript中可通过document.cookie访问到所有Cookie:& r1 \* G* P; m3 p: I( M5 r
"变量1=值1;变量2=值2;变量3=值3;"# i) G- U; _2 K D" L
需经过串分解就可得到每一个变量名及值;# o' |& r! ~$ p
2>写Cookie:
! b- O( E- i7 w! l5 f# ^5 f email="bush@usa.com";( V6 y, I- {' U& b! |
firstname="jorge";; @" b# E* c+ g
lastname="bush";
% P$ P% T$ O3 o( A, N& p expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
3 X' x% i) z' B( }7 Q8 g F document.cookie="email="+email+";expires="+expireDate;# _" f# w* E* x
document.cookie="firstname="+firstname+";expires="+expireDate;9 z* O8 b6 M" m; ~
document.cookie="lastname="+lastname+";expires="+expireDate;
* J O$ }! r+ Z- e3 L& m( @ 下页一例,将网页的文本输入框域变量NAME自动保存下来: - C7 r7 ^6 l5 k4 z
<script language="JavaScript">
7 d) ~3 Q. q* w# p8 @<!--7 a: r3 t s3 ?2 O8 E6 f
function getValue(s,n) // 分解Cookie表达式s2 _4 A+ y5 I3 C* D `! \
{
& j- _( V! i7 b& f7 y6 B var pairs=s.split(";"); // 分解成串数组
& p$ D/ q) h* ^& x8 G7 ^; G for (var i=0;i<pairs.length;i++)
4 l' }5 k5 U5 ]* v6 H {# F3 `& v- L$ [$ i9 A4 M' h
var pairSplit=pairs.split("=");4 Q* k3 p4 f6 U4 [/ T
if (pairSplit[0]==n) file://查找n
1 D8 p6 Z6 V) L0 s! m( E& X return pairSplit[1]; file://取到n的值; T& x4 [( v U2 v+ V3 c4 L
}
; W5 i6 R. ~0 i. n+ ~% j* N return "";
}2 M+ A5 N! Q3 [ o}
9 p: i; Z& g5 m) q! {4 R( efunction getName() file://取Cookie中的姓名NAME
+ [3 l0 n9 ]7 k{
3 t2 w9 P$ V& @, f& P var s=document.cookie; // 取所保存的Cookie
0 W& k. U/ k3 z NAME0=getValue(s,"NAME");0 C5 _0 v; N2 y" C' w& e
form1.NAME.value=NAME0;
/ O% T7 |6 w$ n3 @/ B}, }/ O0 d' b: T* t) r8 N9 P: _
function newCookie() file://将Cookie中存姓名/ s6 c5 Y' n$ s2 w8 g" F
{
$ b! U& k1 i, @+ l9 e! C3 S var s=form1.NAME.value;/ p$ m" z5 _. _# U0 n/ O( J
if (s!="" && s!=NAME0) // 非空则保存, J! w5 {9 `3 K7 k# u
{
5 T1 U% G! P' H/ }# | s="NAME="+s;! I0 Q& H! C* c3 @+ M
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
7 G, R9 ]& R8 e9 a9 B9 L document.cookie=s; // 将保存到客户机中
8 J+ s: h1 n. L+ `8 N: F) N } . v0 K% I& g8 p! j* g" q5 Q1 f
}9 O2 s0 y8 K; x" e7 K) Y$ Z" A5 z7 \
file://--></script>6 e ~* W# i5 Y. s' {8 ?
..................
( H) v0 C) z: \& z5 c& x; g$ ^# \<body bgcolor="#00FFFF" onload="getName();
$ H5 m' ?' L& h! H0 K form1.TEXT.focus()" onunload="newCookie()">* ]$ G* [' y# j9 V7 ] u
<!进入本网页时将执行onload中的getName()>
% s; j6 a$ s, y3 U. A: A5 g<!退出本网页时将执行onunload中的newCookie()>
9 P" a! l$ Y" U, h+ S9 X.................. 7 e! x0 [) n3 a, }+ w
三、BCB与Delphi中用ISAPI对Cookie的存取:/ C/ K" l$ o% o
[注:Delphi用 .代替BCB的->]
$ i. L5 H! S. N) S 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
% t3 f3 L& F; ]. G5 l( M6 M它也可以读取与存入Cookie变量: ! @* j6 p2 V' s, g, V
假设处理用户提交的方法如下:
9 y3 G s5 W- e, G8 T+ evoid __fastcall TWebModule1::WebModule1Action(TObject *Sender,
) @% o- u3 W2 ^( S) eTWebRequest *Request, TWebResponse *Response, bool &Handled) / n' f& Z. l" w" T
1>从客户机中读取Cookie: % U& ~. b: M( F1 m( v, v
Request->CookieFields是个串数组TStrings *,如果不为
; v. Y, }7 J1 J& O, D z空,每一行都将是如下形式:
* p0 y# E8 T# I# u( c Z- j! I, R6 i Cookie变量名=值
; ^8 O: \& G5 X& r: k, p B8 [共有Request->CookieFields->Count个变量,
7 o. p/ o* k; O4 t9 X; a0 u变量名为Request->CookieFields->Names; (i>=0)1 ~& i3 m( F! Z( |9 B" S
Reauest->CookieFields->Values["变量名"]就是对应的值;9 R" Q% S) L3 E. I, V
请注意: 客户首次访问网页时,客户机中并不存在你将要设的
F$ s5 T2 n; C, kCookie变量,所以第一次Request->CookieFields将是空的; 6 P5 \" _$ K U9 V* f% l9 E
2>将Cookie变量保存客户机中:# j+ @; U8 q: e! l3 s3 r
TCookie *pNewCookie = Response->Cookies->Add();6 l3 s$ {+ [+ n* h% A# S, ^, K
pNewCookie->Name="变量名1";" ?& L4 k# }" Q7 O# {' G
pNewCookie->Value="值1";/ x. f+ Q- m; l5 C2 s" m! ^ {3 J
pNewCookie->Expires = Now()+366; // 保存一年/ d: t' L4 a& J8 B: s7 h
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
' u6 w6 ^. m+ v9 z/ {$ h举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
! ~! G: F. _$ c* j" j.DLL后,每刷新一次浏览器,将看到计数值将变化一次: ! l0 Z( O7 q0 Y$ w
void __fastcall TWebModule1::WebModule1WebActionItem1Action(# O) b+ j C# w. v! J
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
M. d f, e6 e7 q bool &Handled)
2 A9 m; X: s; Y+ b{$ w( F" G- x# X# R
TStrings *cookies=Request->CookieFields;& i) P8 I$ ]% q# b# _7 d
String oldvalue1=cookies->Values["count1"]; // 取count1旧值6 R$ w+ G; Z" u4 Y5 r' `; V
String oldvalue2=cookies->Values["count2"]; " ]8 R( ?4 T: b% g9 `
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值6 } D1 b2 S7 _1 l
String newvalue2=oldvalue2.ToIntDef(0)+100;
3 \* r3 }/ G! t9 j TCookie *pNewCookie1 = Response->Cookies->Add();
, L8 L5 w3 _! g( C: x pNewCookie1->Name="count1"; file://更新Cookie2 s; x9 `7 ` E
pNewCookie1->Value=newvalue1;/ X2 J6 d% X% z- X
pNewCookie1->Expires = Now()+366; // 保存一年
3 l, `' ?0 a9 T7 s TCookie *pNewCookie2 = Response->Cookies->Add();
/ Q0 i5 y; _$ b! h9 |4 S5 s pNewCookie2->Name="count2"; file://更新Cookie % B& ]" N+ z8 Z, c$ Y
pNewCookie2->Value=newvalue2;) G/ E+ X1 d% I; z7 a2 }; K
pNewCookie2->Expires = Now()+31; // 保存一月 ; {& a! K- C, R
// 向客户显示Cookie的值: f- y& E! s9 x8 B( I5 i- V
String h0="<html><head></head><body>";; K) q: H2 h" {7 T4 Z
String h1="</body></html>";; {' A" h# |1 W* x y
String s1="计数值1="+newvalue1+"<br>";
: ~6 L% \* n1 \5 J e( c String s2="计数值2="+newvalue2+"<br>";
- N" t3 ]% V5 P# O3 T/ w+ A Response->Content=h0+s1+" <br>"+
7 t3 |: ^5 e" u/ V4 d% E s2+" <br>"+ h1;
+ W; w! k+ W) X; O' Y) i1 q} 3 M* f7 j7 w; s0 l4 }
|