|
[作者:扬州BCB] % r: B$ ^6 z8 u J8 A6 B# c1 K
一、 Cookie概述: , I( F! o' q$ v, U1 m
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。. b' f) c" ^3 }% w0 ?# u% ?$ y6 S
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
8 b$ H1 p8 Q. ?内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可8 V3 C0 E+ z/ @8 h
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
0 R3 y' k: {/ J( m+ H' r的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次1 c4 S- U6 H* @" [. s0 V5 ]9 \' p$ X/ T
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
; x6 O) h3 [6 q- q9 |! x1 b6 s$ f+ j页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫, d% q" _' m- ?( z
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
6 p2 s1 S+ Q0 [; [! w使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; : ~/ Q1 a* z Z5 H! I6 i4 J
二、JavaScript脚本对Cookie变量的存取:
/ w: r6 |4 N4 J3 [; [" h" [ JavaScript是运行在客户端的脚本程序,用它可将文本输入
( V: W, _" F7 R1 u+ m4 K& P& _% y框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍: S7 ]8 I$ p. [* A' n, l5 x8 j
微减轻Web服务器的一点负担: ; \# W9 C0 W/ T. H% I
1>读出Cookie:
: Z8 N$ x: Y0 M' D JavaScript中可通过document.cookie访问到所有Cookie:8 N7 k) @2 T5 S2 b7 Y7 Z# M% a
"变量1=值1;变量2=值2;变量3=值3;"
8 b1 C$ _! i: ^- V# z$ a) Z0 o 需经过串分解就可得到每一个变量名及值;+ ?! u" k- [+ K) i
2>写Cookie:) y1 ~/ E2 n( R' N! L
email="bush@usa.com";* f& G# s* v) a3 n+ T% a
firstname="jorge";" ]+ d( M' j; [0 L% C
lastname="bush";& E7 P6 F. C- B' @7 x
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
! p3 \& b* B8 {. a3 o7 q: g document.cookie="email="+email+";expires="+expireDate;
) W: u4 ]; D, u# q6 e" o9 }" A+ F document.cookie="firstname="+firstname+";expires="+expireDate;; Q: F( e" |6 s2 h% t3 G" a
document.cookie="lastname="+lastname+";expires="+expireDate;
2 d v+ ~/ K/ A+ W 下页一例,将网页的文本输入框域变量NAME自动保存下来:
- S( A( h7 _8 w% _6 j<script language="JavaScript">4 I' Q: T7 ?9 Y8 `
<!--. c; j1 E2 x% a" D* a! ~7 N$ D
function getValue(s,n) // 分解Cookie表达式s, F5 E- w P, B) Q1 t& O! G$ i$ e
{6 A9 t4 Z" H3 M9 {3 {2 [9 n
var pairs=s.split(";"); // 分解成串数组
* Z/ u2 K. m# F for (var i=0;i<pairs.length;i++)
6 \) U6 B- V7 s) B/ v) n' a! y {$ s O5 s, H( v: \8 e
var pairSplit=pairs.split("=");) j1 j' _; e- H' p6 q b. Z/ b
if (pairSplit[0]==n) file://查找n
( m9 m9 l' K, b' D; D% R! D return pairSplit[1]; file://取到n的值( w3 Z x6 q; h% s# }: N# v
}
) T" z' Z3 a0 E" c$ Z return "";+ K$ D1 r6 s$ K
}. L) Q5 f" U3 h8 n
function getName() file://取Cookie中的姓名NAME' I4 C' b" _. `6 j
{& s3 A, _: |" h1 }! m; m: d
var s=document.cookie; // 取所保存的Cookie
+ N9 q0 i7 p$ z$ B6 ? NAME0=getValue(s,"NAME");9 ]( Y% u0 h, ?9 _3 K- S
form1.NAME.value=NAME0;
$ Q& |! V p7 d: U0 p" F}' M- I+ L# g3 q; R* {$ j, a
function newCookie() file://将Cookie中存姓名
2 z. x7 h. |) E- ^; Y/ x3 [8 [$ T I{: w- \3 b5 C; Z
var s=form1.NAME.value;
( {5 B7 R) {2 N8 o, g% Y if (s!="" && s!=NAME0) // 非空则保存2 S i6 M4 C o
{ F0 _0 H/ x4 h8 d" X* w
s="NAME="+s;
' G- n' F0 [$ ]2 O" q6 c3 A s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";( w' c) v( A+ R/ d4 l; H+ X" m
document.cookie=s; // 将保存到客户机中
5 x s/ t+ T. w } , X, ~3 ~; T- g
}
. k* a: \$ I% xfile://--></script>! S0 L/ ^2 A t5 F" B$ N* s
..................
5 K( _5 t# K% t% P5 W<body bgcolor="#00FFFF" onload="getName();6 M* z1 x$ Y- R( h4 l8 f/ n" o
form1.TEXT.focus()" onunload="newCookie()">
- W8 h) d* o+ M" R<!进入本网页时将执行onload中的getName()>6 N* G4 @) \; m6 H9 }. Z8 A# H
<!退出本网页时将执行onunload中的newCookie()>
; c3 u K% I$ T..................
# v$ W& Z2 B% ^3 u @) I 三、BCB与Delphi中用ISAPI对Cookie的存取:
- ~* h) S! g7 n! z! i O0 r [注:Delphi用 .代替BCB的->]
2 A( i3 [% Q5 V 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,: X6 Y9 B' h! ~" s. G
它也可以读取与存入Cookie变量: + g/ C9 c3 Y" l8 u: ^
假设处理用户提交的方法如下:
# n& z; T) a, Y3 T: h6 {1 {9 ^void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
3 C5 a% r% b& t/ Z% a/ nTWebRequest *Request, TWebResponse *Response, bool &Handled) . C+ S" k1 D( s' q4 a3 ?
1>从客户机中读取Cookie:
A: K' R! b* ?/ B/ A Request->CookieFields是个串数组TStrings *,如果不为( [( T( k1 T$ z% x* M* t
空,每一行都将是如下形式:
; K: o6 y" A# e) X/ Z& P% \ Cookie变量名=值
4 I6 g r/ s/ c" e \共有Request->CookieFields->Count个变量,6 V8 t7 k& d; E1 S# G- f; u
变量名为Request->CookieFields->Names; (i>=0)% m4 _$ a$ N+ N6 n1 h t
Reauest->CookieFields->Values["变量名"]就是对应的值;
F0 F; R2 N7 F4 R请注意: 客户首次访问网页时,客户机中并不存在你将要设的% w8 ]; L- T% S6 r4 l/ ~1 ]
Cookie变量,所以第一次Request->CookieFields将是空的;
7 x5 ?/ q+ M; C+ Y9 J" C/ W 2>将Cookie变量保存客户机中:0 B, j( I1 S5 z5 `9 { X
TCookie *pNewCookie = Response->Cookies->Add();
. B! y) S% o" x9 L pNewCookie->Name="变量名1";
: _, _& U4 J; A$ S) r pNewCookie->Value="值1";
6 V: c& f; s: J. u* U! U0 G pNewCookie->Expires = Now()+366; // 保存一年% l# G4 Y2 Q, Z- E2 L( U3 P
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
0 _" G! S$ M4 X" G7 e举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交+ s$ D+ j/ V4 X: C
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
) m& S- g, Y* Mvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
$ |. t* m* `5 e$ u, ` TObject *Sender, TWebRequest *Request, TWebResponse *Response,
3 N& f) e$ D- F1 H/ J! y bool &Handled)6 w$ y: e$ J, y9 P- |- R
{
$ Y4 h* N+ t* S' C! E, h" B TStrings *cookies=Request->CookieFields;# n$ c( ?- Q3 P6 U( Y9 A6 f
String oldvalue1=cookies->Values["count1"]; // 取count1旧值1 T1 P& l* E5 i8 y. b
String oldvalue2=cookies->Values["count2"];
; F9 L; J+ u, ?6 s0 t String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
# h4 s6 P5 }! t* r String newvalue2=oldvalue2.ToIntDef(0)+100; : w3 @( r1 `7 o( O7 N. d
TCookie *pNewCookie1 = Response->Cookies->Add();/ d, b4 [2 G& `3 U! i* ?
pNewCookie1->Name="count1"; file://更新Cookie
0 I# q+ u( p- _& K% [$ H pNewCookie1->Value=newvalue1;; C8 p7 f9 W- w+ W# x& m
pNewCookie1->Expires = Now()+366; // 保存一年
3 E7 F2 f5 g+ c7 i9 e t" e0 N TCookie *pNewCookie2 = Response->Cookies->Add();8 l' x6 D: b- ^# L. f- C& X$ R% e
pNewCookie2->Name="count2"; file://更新Cookie
4 r5 n( w j( |* T, x pNewCookie2->Value=newvalue2;
( o |# b# N) k4 L% M% I pNewCookie2->Expires = Now()+31; // 保存一月 9 w! }$ [* _4 b7 e& |
// 向客户显示Cookie的值
& R, P& J# E0 n9 x$ r8 Y# t/ M W String h0="<html><head></head><body>";5 O$ w% F# {3 m; f
String h1="</body></html>";4 Q2 O6 ?6 L: |8 k- K
String s1="计数值1="+newvalue1+"<br>";
/ g- F) q2 d8 D8 s String s2="计数值2="+newvalue2+"<br>";
: t. `4 S. u, e. H) C+ i Response->Content=h0+s1+" <br>"+, N, _4 }! }2 j) T& z$ Y
s2+" <br>"+ h1;/ Q6 O6 {/ [' I o. {
} ! h2 D9 ]- e6 U7 I8 i0 @! s, d
|