|
[作者:扬州BCB] 3 H9 N! y# _- j' f) }" r) B1 c
一、 Cookie概述: 1 u2 R$ n: }# E
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。! d1 O) L0 T! i$ t
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机* @% Z' Z! ~- T7 C* v( {
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可0 n' j1 A# T4 s; l8 T
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
! J9 S( v4 z" ?3 u的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次% h. F. a5 ?/ x$ h8 L
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网8 l! @% Z, r6 o" |, m
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫2 \* y- Q$ ^$ G
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,' R0 y" _& b$ k9 P" g8 N5 A% q
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; 9 u' s6 I! g( @/ Y: I" o7 k6 J
二、JavaScript脚本对Cookie变量的存取:/ }. K! J k1 r& V) a
JavaScript是运行在客户端的脚本程序,用它可将文本输入1 @4 ?" M7 a8 `5 b7 q( \
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍# {7 s8 \+ q3 I+ x) G/ _
微减轻Web服务器的一点负担:
* ~- Q/ {6 O7 i0 d+ c 1>读出Cookie:
3 w4 d9 `* q) P+ l" S JavaScript中可通过document.cookie访问到所有Cookie:* ?. U) R% I2 ~3 f1 F/ T' ?
"变量1=值1;变量2=值2;变量3=值3;"
, Y) n3 t8 s. a4 e' N 需经过串分解就可得到每一个变量名及值;
, Y) J( g! {) G! ^8 H* }& @ 2>写Cookie:
: w% R3 A$ c. y% v/ ~% L" p email="bush@usa.com";! \1 |$ J+ X$ x! o7 t
firstname="jorge";6 b& p M/ t! F% |
lastname="bush";8 V; y t9 t6 e1 X( e9 q+ W, w k
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";: d2 U R! L& W4 ^
document.cookie="email="+email+";expires="+expireDate;
! p# k/ J- I5 L/ \1 t( x document.cookie="firstname="+firstname+";expires="+expireDate;5 y& M& [5 n& s. J/ ?* A' o
document.cookie="lastname="+lastname+";expires="+expireDate;
' A4 e/ n6 \. F* g$ F 下页一例,将网页的文本输入框域变量NAME自动保存下来:
7 j( V& e6 ^4 C7 G3 D1 k& a4 [<script language="JavaScript">
; i% Y( V" q/ T* q# q5 l, w9 E S<!--
5 o$ S0 i& E! P d$ qfunction getValue(s,n) // 分解Cookie表达式s, L7 }% a4 M. Q }" b
{
- E( a! k6 U/ k, q9 i* j0 a9 U+ t var pairs=s.split(";"); // 分解成串数组
* f$ B2 w) V! I4 L. M! c- b for (var i=0;i<pairs.length;i++)' U2 \! i. N5 o$ u. E) d
{
' `3 X$ u& ?3 i var pairSplit=pairs.split("=");
8 |7 `3 W; Q- U9 X+ W5 d0 E if (pairSplit[0]==n) file://查找n
3 a0 I5 @6 p, N9 @# {5 e1 L return pairSplit[1]; file://取到n的值 n& L# x& m' G5 v2 \2 o
}
' h3 _+ L8 l$ e: g7 w* a/ A return "";: c1 c0 t$ C3 D) G% h+ k3 A
}, m- D, D c" k5 h; F# n) Y
function getName() file://取Cookie中的姓名NAME
, y4 w" W1 ?! D% Z: l& {{1 {! f- ^6 c$ A; w' w: N
var s=document.cookie; // 取所保存的Cookie- u# R d4 P! L8 e$ b
NAME0=getValue(s,"NAME");" Y. f3 {( {8 ?
form1.NAME.value=NAME0;
* [0 {8 d6 a r; W}6 H, L9 A" v" I
function newCookie() file://将Cookie中存姓名8 U9 z. O, i& G- J( x
{
R$ Y7 C+ ^, s0 m. s! Z var s=form1.NAME.value;
2 T& |$ W6 k8 l6 |! { if (s!="" && s!=NAME0) // 非空则保存
- I0 U- S# ]) H1 I( a. v {5 @7 f6 D6 N! N7 U0 \) I
s="NAME="+s;
, C0 H8 [$ o: c) s1 E! i) V s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";0 d( g6 e' K; r2 I
document.cookie=s; // 将保存到客户机中4 {5 V+ W; Y2 j6 [+ c' b' T
} 5 F; D+ R/ n1 G! g g
}
- }; A( | q; p6 t6 p5 |- kfile://--></script>
1 g& m+ f; \9 {6 Q..................
9 e" O' y" Y9 d) V8 e6 P G<body bgcolor="#00FFFF" onload="getName();0 j; z H& u8 F3 q! c; U, s1 L
form1.TEXT.focus()" onunload="newCookie()">
) D- [' I! p) I$ N. Q<!进入本网页时将执行onload中的getName()>
/ u! C# t& F* M- ~# `% @2 ^<!退出本网页时将执行onunload中的newCookie()>
0 n+ Y' E( Z* Q7 N3 j% p: I.................. / ^) a- l! ^3 G% F( {3 F
三、BCB与Delphi中用ISAPI对Cookie的存取:
2 D3 c) `: U6 }: p, I& R [注:Delphi用 .代替BCB的->] 7 c5 a! o: ]# `/ u0 b; C
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
& f! q( D2 f5 Y: s3 c; k8 [3 U它也可以读取与存入Cookie变量:
* H; f' Q: s) e' E3 C* a, ` 假设处理用户提交的方法如下: + l' l$ S1 Q% Q+ Q" j
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
" I& p" B& r+ J, R2 M9 w: C4 hTWebRequest *Request, TWebResponse *Response, bool &Handled) ' `5 Y: J0 i, W+ [2 F0 `
1>从客户机中读取Cookie:
5 U `* }! V" ~7 b5 ]! v* v Request->CookieFields是个串数组TStrings *,如果不为% Z5 e, g, K. w* P
空,每一行都将是如下形式:
; Y0 Z2 }# F l: n; g3 e$ D: e Cookie变量名=值
" x/ G- } p9 x8 g共有Request->CookieFields->Count个变量," l5 \% R+ L. b* z* o
变量名为Request->CookieFields->Names; (i>=0)
v& z7 M' R% z& z0 g! E. iReauest->CookieFields->Values["变量名"]就是对应的值;
# L1 Y% c D4 U) w请注意: 客户首次访问网页时,客户机中并不存在你将要设的
7 F3 g( Z# H- Q2 D) K$ H5 k% @: jCookie变量,所以第一次Request->CookieFields将是空的;
5 F# B! Z9 u' k" I) C1 z 2>将Cookie变量保存客户机中:
8 P8 | P8 v2 ^# C& K# i TCookie *pNewCookie = Response->Cookies->Add();7 ?& v6 g+ \! m( F' m8 l% O
pNewCookie->Name="变量名1";
# L$ w- N% ~, o* p/ k pNewCookie->Value="值1";
7 d* K, V) q7 q pNewCookie->Expires = Now()+366; // 保存一年
+ z2 w8 u9 u: L就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
- d5 W# t+ Q& f9 N' D举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
% Y' e4 k/ E0 p7 w.DLL后,每刷新一次浏览器,将看到计数值将变化一次: ; e/ \' K+ E0 C- b5 ^. Z0 e
void __fastcall TWebModule1::WebModule1WebActionItem1Action(* k. z4 ^9 \ m; w" }# q
TObject *Sender, TWebRequest *Request, TWebResponse *Response,& t# F: K; Y: C
bool &Handled)
# f& f7 i- q/ X3 x/ X. }! U{) T8 ?0 Z' Y4 [+ A, ^
TStrings *cookies=Request->CookieFields;7 W0 C% t$ B; k$ n
String oldvalue1=cookies->Values["count1"]; // 取count1旧值* \ `* Z0 `! J3 k' [: X
String oldvalue2=cookies->Values["count2"];
* Z/ b# a9 c5 K String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值! G4 q) \' |, H. |- [+ |
String newvalue2=oldvalue2.ToIntDef(0)+100; # p; ~) w" ?# k2 w
TCookie *pNewCookie1 = Response->Cookies->Add();$ S% `" M6 I! y7 Q0 B1 _
pNewCookie1->Name="count1"; file://更新Cookie$ w$ t8 E1 @6 C9 w3 P9 Q0 E; K
pNewCookie1->Value=newvalue1;
" t6 o. P1 W! w1 M pNewCookie1->Expires = Now()+366; // 保存一年
- o, D/ O- l/ y* J/ i1 ` t TCookie *pNewCookie2 = Response->Cookies->Add();; _' t2 k+ Y7 L2 ^
pNewCookie2->Name="count2"; file://更新Cookie
/ Y- E3 ^2 c4 [ P0 A# r# ? pNewCookie2->Value=newvalue2; \) Q) o/ c) Z( V# ~8 H
pNewCookie2->Expires = Now()+31; // 保存一月 / k1 ?' a3 A) ]( Z1 h1 \
// 向客户显示Cookie的值! F- c @" @2 @' Q+ t/ L* f+ f5 t
String h0="<html><head></head><body>";
7 b6 \0 Z+ w# \; p% [: b2 H String h1="</body></html>";
; v& F: F- J$ }0 ]/ K String s1="计数值1="+newvalue1+"<br>";3 X& x( u; k; K) _4 L$ W+ M
String s2="计数值2="+newvalue2+"<br>"; / ^$ u. j4 I3 @" N- E
Response->Content=h0+s1+" <br>"+
' J @. [8 |. H s2+" <br>"+ h1;
9 `! }0 m* x1 k} 0 z* ^/ }: ]- p" d4 x% Q
|