|
[作者:扬州BCB]
) J# R- f' r0 I) a6 z 一、 Cookie概述:
6 D% Q6 p$ M2 }3 f8 f' R# P: ~ 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。
0 b- m- K5 y% p. | Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
. P0 P& { Z& X7 j+ n7 b, j) P内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可& l/ p( z3 a B' w. |
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
) j% K& |, K5 q; b7 g" M的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
1 k, C& U3 P& {, P- q所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网3 X- ?, e+ J S/ o
页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
1 |5 ^# u1 C- S7 H: _小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,
9 Y; R, e- ]2 Z9 a9 @9 }使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
. S2 ]3 E- D( R7 b 二、JavaScript脚本对Cookie变量的存取:. T, E8 |& n6 W& R8 C
JavaScript是运行在客户端的脚本程序,用它可将文本输入: U, V4 _5 O( F) ^3 S) `
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍
7 y; z) n; J* B" F ~8 F微减轻Web服务器的一点负担: ' a0 g' m7 p3 D, ?" m5 i
1>读出Cookie:
! ]6 v8 F' T6 X JavaScript中可通过document.cookie访问到所有Cookie:
" J. d) a; l. q$ T% K( ` "变量1=值1;变量2=值2;变量3=值3;"
# q* `! e( M7 N 需经过串分解就可得到每一个变量名及值;9 i/ l$ U* b" m# n
2>写Cookie:
; D0 \9 H$ P, g; | email="bush@usa.com";/ F& o) _0 c9 _. K3 ]
firstname="jorge";
& ^; {" l4 t; h4 f lastname="bush";9 m4 j& f# y: {5 ?* R, { R
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";1 ]; x# d: h( t2 W
document.cookie="email="+email+";expires="+expireDate;. b* E3 s% `9 X2 v3 k% `$ w
document.cookie="firstname="+firstname+";expires="+expireDate;+ k Z3 W$ t* M# ]8 M2 {
document.cookie="lastname="+lastname+";expires="+expireDate; ' V# Z/ L5 E% q: D' `. o8 ?
下页一例,将网页的文本输入框域变量NAME自动保存下来: 0 ^5 s7 K- o( Q
<script language="JavaScript">
: K* L, e2 n) ]6 X a<!--. M5 Q2 K; I5 B; u) v# w9 e- T
function getValue(s,n) // 分解Cookie表达式s1 E- j" x1 _9 V& k Y. h
{) J9 F6 p# {2 f) h3 d D6 w
var pairs=s.split(";"); // 分解成串数组
# @* S3 {+ n7 \. `$ C. A for (var i=0;i<pairs.length;i++)
/ B) H$ @; T5 _( @ {
; ?& r3 x; Q' B. }# z. D2 y var pairSplit=pairs.split("=");% U6 v4 ~* e0 L% e6 p' h1 s1 h e8 z
if (pairSplit[0]==n) file://查找n
1 V+ q' U! P' T" `: q; Z return pairSplit[1]; file://取到n的值 z& b+ {1 y4 I! y2 [# Z1 ^' |
}
x' c/ ]( v- n1 c! S3 }3 m5 i4 R return "";7 U+ i: N' P. L3 D% I
}( d$ F3 L: X" h& }
function getName() file://取Cookie中的姓名NAME
! Y6 |* L3 b- M{& J4 s! U2 a! M; N7 K& x. }
var s=document.cookie; // 取所保存的Cookie9 L6 B; b2 [) X7 h
NAME0=getValue(s,"NAME");- u+ O; V# v5 |2 w0 u
form1.NAME.value=NAME0;
9 {+ R/ E. N `! A}
; |5 o4 L4 U: B" n' bfunction newCookie() file://将Cookie中存姓名
& x1 G; Y2 F6 ]% D{
1 o$ L2 E3 \" P- B" s- g var s=form1.NAME.value;
/ G+ b4 ?3 X. W- e if (s!="" && s!=NAME0) // 非空则保存/ m1 N2 k' u$ t6 d$ _
{
8 e* u% i6 v/ G. b' l' B s="NAME="+s;
3 K% {/ x$ p! Z! O) Y! S s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";+ U) L9 X- g" e1 K& t m% x- p
document.cookie=s; // 将保存到客户机中
& \ h2 c- M9 ?5 [* J. ?5 \ }
; t2 c( z* ~2 v}
1 t$ v% |& n! Cfile://--></script>
" X2 B# V ?* X4 P/ X9 C.................. 3 Q$ g- S8 h/ h1 H- ?. c2 W3 B
<body bgcolor="#00FFFF" onload="getName(); p9 Z5 a$ J/ u2 F# G
form1.TEXT.focus()" onunload="newCookie()">9 V# N4 \& M1 i! o$ |
<!进入本网页时将执行onload中的getName()>$ l* W0 Q8 y' `2 i
<!退出本网页时将执行onunload中的newCookie()>) o+ a- I' g# R
..................
" C- I/ d" U* Y* V4 T 三、BCB与Delphi中用ISAPI对Cookie的存取:/ N k% L" C7 Y) X# C! _1 [* N
[注:Delphi用 .代替BCB的->] # g6 }/ z3 m; N1 u
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
" L$ z S% f- I, Z# O. a& @" @6 M它也可以读取与存入Cookie变量: : E- L# g0 s/ | ^
假设处理用户提交的方法如下: 8 |5 ^) ^( P' b. t. U9 A6 x. _ A9 a
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
V: @: V$ l; j; dTWebRequest *Request, TWebResponse *Response, bool &Handled)
7 q Q7 Z$ K4 S$ `8 r 1>从客户机中读取Cookie:
2 h& B4 l6 L0 }! ?8 [* G Request->CookieFields是个串数组TStrings *,如果不为4 {3 j' E1 j8 V! G! O7 P
空,每一行都将是如下形式:
- d4 e: Z' U; c& D- N1 Y+ @ Cookie变量名=值$ y, @+ Z" M; M, ~
共有Request->CookieFields->Count个变量,
% e: y7 o5 z2 b- q6 I变量名为Request->CookieFields->Names; (i>=0)
! x9 O# k. }5 a: G0 WReauest->CookieFields->Values["变量名"]就是对应的值;. q% l8 l1 h+ ~" @
请注意: 客户首次访问网页时,客户机中并不存在你将要设的 P7 M' U+ {6 p/ R6 B$ Q+ Y' B
Cookie变量,所以第一次Request->CookieFields将是空的;
' `5 i: M' J. w 2>将Cookie变量保存客户机中:9 H/ s% v+ W" K' v! Z
TCookie *pNewCookie = Response->Cookies->Add();6 I6 x+ H. e, h; e8 m
pNewCookie->Name="变量名1";
/ {1 `1 U- P1 j/ F5 y+ H0 n% _ pNewCookie->Value="值1";1 h" t& V) T& m% A9 M, m9 P/ F
pNewCookie->Expires = Now()+366; // 保存一年1 V* \$ q8 r7 L0 T( C( d
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; # f# x7 Y4 e# M6 c2 c
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
6 M. Q' [* T' k. W; c" F.DLL后,每刷新一次浏览器,将看到计数值将变化一次: ! @# w# s- h- v& K9 c
void __fastcall TWebModule1::WebModule1WebActionItem1Action(* ], f/ F) B v: X7 b6 O+ Y
TObject *Sender, TWebRequest *Request, TWebResponse *Response,
" E2 ?% X7 N2 {7 `0 ]$ |' @ bool &Handled)
* U- ^/ E) X+ \4 o4 J# V y{
( z# ~' U4 u6 G# d7 z5 n TStrings *cookies=Request->CookieFields;
& [# S# d# N) V String oldvalue1=cookies->Values["count1"]; // 取count1旧值( B7 \# X+ T. }' q
String oldvalue2=cookies->Values["count2"]; , r3 z( |+ d; Y9 V
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值2 {, l6 w0 R: _' N
String newvalue2=oldvalue2.ToIntDef(0)+100;
0 `; P, B/ x6 t c0 S* z0 X TCookie *pNewCookie1 = Response->Cookies->Add();- R- g: h9 X. K! g, P- Z
pNewCookie1->Name="count1"; file://更新Cookie
2 t- E, R# Y7 i. p( ?8 t pNewCookie1->Value=newvalue1;( v z7 x0 W0 l0 k& s) \2 n
pNewCookie1->Expires = Now()+366; // 保存一年
' z; j. ~- o9 H! ` TCookie *pNewCookie2 = Response->Cookies->Add();& w, \; J3 v* I. u5 _! z
pNewCookie2->Name="count2"; file://更新Cookie
6 x$ I2 k6 x4 p0 ?$ @! L2 }) e# L pNewCookie2->Value=newvalue2;
# ^) i; Q8 V0 _ pNewCookie2->Expires = Now()+31; // 保存一月
" [, N/ j3 v3 t0 K/ T // 向客户显示Cookie的值3 v6 X& d9 Z) _" {& O8 L6 ^
String h0="<html><head></head><body>";
! \# _6 ~' _8 R8 |: A6 Q, }2 J( x String h1="</body></html>";
/ T1 N: w; N# S9 B1 \7 R String s1="计数值1="+newvalue1+"<br>";
1 c% x$ }3 e" P$ O8 D String s2="计数值2="+newvalue2+"<br>"; - b, e! z6 a6 I5 w/ d
Response->Content=h0+s1+" <br>"+7 m& u; m9 _8 i/ h
s2+" <br>"+ h1;
! d2 e, e1 j! C7 _8 V} 6 P+ t/ c# A1 ^, z7 N% v5 U1 J
|