|
[作者:扬州BCB]
3 a9 h! n: b7 h: ?1 L" l! W 一、 Cookie概述: 2 q2 i) V- r2 L6 h; L
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。4 ?9 P) {: b+ V; |/ k2 r9 `) o' k: S
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机, `. H" E; {0 }
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可5 ]/ u) K! ]6 x5 ?
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
9 v) c D3 L* H% T# }的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次& O, Z/ X$ C+ H& z3 m
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
. [3 h5 p H4 @4 R- W( i9 [. k页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫! z& N- N; z# r% Z) W( ? Q1 t
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
* Y# H3 A( b4 U' I* a. I使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; / G' C, y" k8 J/ {/ t
二、JavaScript脚本对Cookie变量的存取:
& P7 F# X6 K5 \; | JavaScript是运行在客户端的脚本程序,用它可将文本输入: F; ?6 ~9 S$ e
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍- W% R$ o: {/ U. L
微减轻Web服务器的一点负担: 0 r' T2 k2 {# q5 e. P
1>读出Cookie:
7 k2 s$ ]) [% m5 r JavaScript中可通过document.cookie访问到所有Cookie:$ @2 m+ H: y* c, \
"变量1=值1;变量2=值2;变量3=值3;"
{ f+ S3 m' x$ n0 ?* z1 ~" s2 y 需经过串分解就可得到每一个变量名及值;2 L% Z+ u/ ]& W* a
2>写Cookie:
: u! I" m- \) x, e3 \ J" y email="bush@usa.com";" z; ~9 _$ @. e( ]3 [
firstname="jorge";
, l$ O3 n0 w9 q( n) S& w; @8 q lastname="bush";
8 n, A$ ]2 Y/ q- P" k+ j! s expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
& I0 }: f# M% S document.cookie="email="+email+";expires="+expireDate;
7 j" h p- U, {' Z- ]- A# f document.cookie="firstname="+firstname+";expires="+expireDate;0 c8 W, v9 ]) |& G' W) q7 {* f
document.cookie="lastname="+lastname+";expires="+expireDate;
, G7 R P. G3 [, l$ h3 _# c' y 下页一例,将网页的文本输入框域变量NAME自动保存下来: ; a& Q8 _* g& \* B- }( i0 V
<script language="JavaScript">4 Z) Y: ?4 N( D+ d) a- G* y
<!--
3 ~- W& n# u8 E1 _& I# `function getValue(s,n) // 分解Cookie表达式s
; z: E3 k( b! h{0 [- |# j3 c, [# @
var pairs=s.split(";"); // 分解成串数组" _) \0 p" S0 V# }0 I
for (var i=0;i<pairs.length;i++) v$ `9 d+ H4 s6 p
{7 Q. g7 ]) g% e' T0 Y, L! x
var pairSplit=pairs.split("=");
9 ]+ R/ u% V. F D5 g8 S4 X if (pairSplit[0]==n) file://查找n
3 B0 A" j7 W. c% x( ? return pairSplit[1]; file://取到n的值8 J+ P. b3 V/ m, E
} 7 Y3 C0 t7 Y$ F! {
return "";
) h) u' p) ~2 Q- M) F) g/ s}, w/ m4 k/ a: X( [# }# u v
function getName() file://取Cookie中的姓名NAME: [; I* M" }( V6 o9 z
{
I5 ]) {( t. t- K% e var s=document.cookie; // 取所保存的Cookie1 F& W6 ^* {6 x4 _- p
NAME0=getValue(s,"NAME");( P) u% I5 c/ D8 P Q1 }) a/ [$ d J6 [
form1.NAME.value=NAME0;! D) N2 b) F& }; d
} q/ {5 a- H% C% b+ J5 N# \' ?: ?
function newCookie() file://将Cookie中存姓名1 |3 X7 }! H* O4 Q$ d: h# m( b
{- m- X# u$ ^3 g0 U# V; e9 L
var s=form1.NAME.value;
- t% d/ I1 j* u6 r) r if (s!="" && s!=NAME0) // 非空则保存0 B6 N3 U: j" ]" a' d, p3 @% L
{9 S$ n8 U/ X4 b. ]9 Q# p
s="NAME="+s;! t( [* R- Z! Y& B% Q+ R
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";. B9 b, y8 P1 z {; Q
document.cookie=s; // 将保存到客户机中9 @3 R: T* I5 u; ~ X( X O4 P
}
3 f# V0 m6 L8 N, p, _6 W+ K}
1 }+ D# ~9 v0 b. }file://--></script>
; x& }6 W$ s) O. [) f, S, `..................
" ~4 C$ ?3 ~/ f" i5 y<body bgcolor="#00FFFF" onload="getName();
* `1 Z2 H+ O2 H& A) K: o form1.TEXT.focus()" onunload="newCookie()">' v5 E4 f% U: j g' l8 q3 `- }
<!进入本网页时将执行onload中的getName()>
" t- T. B& K/ D. Q<!退出本网页时将执行onunload中的newCookie()>8 k4 a& i% s, X$ x2 x
..................
, @3 @( l9 |, e. v$ Z 三、BCB与Delphi中用ISAPI对Cookie的存取:
! V* c' Z! l5 P! Y8 Y7 V [注:Delphi用 .代替BCB的->]
* Q. M" P! r* U 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
8 r6 y3 c/ h5 \6 Q它也可以读取与存入Cookie变量:
9 L5 n8 J- S/ J1 t% B 假设处理用户提交的方法如下: - C3 A3 L$ T. n! h" d7 C5 j
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
: E) {& o1 C( h+ ^0 ?0 F& s/ vTWebRequest *Request, TWebResponse *Response, bool &Handled)
; |2 w0 T- t4 z; L6 z1 ^ y0 e 1>从客户机中读取Cookie: : c6 W" q# P! }9 M: W
Request->CookieFields是个串数组TStrings *,如果不为6 Z8 L! n* g4 I8 Q; d
空,每一行都将是如下形式:
! S& a1 ]9 h9 M; W8 Z Cookie变量名=值: Q( ]. c! `, ~ w- i
共有Request->CookieFields->Count个变量,* g( S9 S7 [$ d# k
变量名为Request->CookieFields->Names; (i>=0)
P( }2 O9 n9 M$ t$ V+ LReauest->CookieFields->Values["变量名"]就是对应的值;
6 z3 |) ^. V7 [! c8 a' q+ M7 z& K请注意: 客户首次访问网页时,客户机中并不存在你将要设的' f% Y A5 Y: P# u% {! f# ?
Cookie变量,所以第一次Request->CookieFields将是空的; % M, d" y+ d$ h
2>将Cookie变量保存客户机中:% i, V7 ^3 e, I9 v- I5 l' K
TCookie *pNewCookie = Response->Cookies->Add();
8 W) w* a7 u/ `/ J# A' ? pNewCookie->Name="变量名1";
$ I) L& l5 z4 ^4 o0 c" ~ pNewCookie->Value="值1";
) c& ^5 f* M" p" d6 B6 H pNewCookie->Expires = Now()+366; // 保存一年
0 B# K, w$ S% D6 L% l7 `1 N就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; 5 K/ [, y; J9 g# d+ y3 \5 k- \
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
% \, I# p& T. v6 Q3 e {9 u.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
; n' R8 A/ m# I7 D- Q5 O5 E; N& Cvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(
" L' L' O) P7 j$ y7 o TObject *Sender, TWebRequest *Request, TWebResponse *Response,. x/ _" a# Q0 ]% s: p5 K
bool &Handled)
6 u* k. C9 a/ R( h, f) L{$ v" Q g, X; \% e6 p9 M8 W; B0 Y
TStrings *cookies=Request->CookieFields; R8 V; n+ J1 k# D& j
String oldvalue1=cookies->Values["count1"]; // 取count1旧值) N1 h! f0 |% v) E3 ^ j# `7 Y
String oldvalue2=cookies->Values["count2"];
$ r8 y3 D9 v7 D) d String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值; M9 B, J1 _- n5 F
String newvalue2=oldvalue2.ToIntDef(0)+100; - D! S/ D" a7 @( ^% b
TCookie *pNewCookie1 = Response->Cookies->Add();
; C% s, c8 o* k! G' _9 q pNewCookie1->Name="count1"; file://更新Cookie
+ e$ d. f( L! w+ s$ t, z- i6 ?5 @ w pNewCookie1->Value=newvalue1;/ G2 Q- F' S; O, e
pNewCookie1->Expires = Now()+366; // 保存一年
7 C' m7 w7 X( S E/ i TCookie *pNewCookie2 = Response->Cookies->Add();. y2 I |" W* Z; V/ z, B
pNewCookie2->Name="count2"; file://更新Cookie
5 h$ S! ?! M; J+ D0 u6 | pNewCookie2->Value=newvalue2;
1 b* K$ k0 y6 E5 w0 ` pNewCookie2->Expires = Now()+31; // 保存一月
9 v: B: M* P% E1 ]$ Y+ ^( s // 向客户显示Cookie的值
* V _4 L% G. {2 b' o: ? String h0="<html><head></head><body>";
' c$ j& G8 A* I0 _ String h1="</body></html>";4 \2 U5 l: F* }4 J- N' r; H4 |& o* S
String s1="计数值1="+newvalue1+"<br>";
3 v( L4 H( w6 N# _! U: u2 m" Z String s2="计数值2="+newvalue2+"<br>"; " K) r7 E( |7 j; i" _
Response->Content=h0+s1+" <br>"+
7 c* {/ D) c% D5 Y- Z* R s2+" <br>"+ h1;1 b5 x$ a" B( v" B/ ~) [# ~
}
/ w& Y2 z* N z8 ?# [7 s |