|
[作者:扬州BCB]
1 y' f$ t6 j1 _2 w 一、 Cookie概述:
2 j* l' U& Z, A# f/ I 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。7 I) ]3 F& |9 x+ y
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
) [% X! r" H+ z; s内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
+ u5 m0 A1 i) R, J# b/ q" s% u8 M! p测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
3 x) z5 a, [& n4 o) ?的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次5 U+ i" \1 V/ @& B& D& \( Z% r
所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
7 v% G H+ N$ g8 W$ z( f4 t% `页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 z$ o/ r2 t. V8 @% m/ T W) n
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,$ i9 x' w# _1 ? @" T
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
1 k9 ^, U& Z" u/ @$ o 二、JavaScript脚本对Cookie变量的存取:
6 @; t$ f. Q- F' Z JavaScript是运行在客户端的脚本程序,用它可将文本输入) A* y5 \% H9 P' F
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍+ I) j3 a/ u) E' Y: C
微减轻Web服务器的一点负担:
% q% U. b: v- Z$ F' s 1>读出Cookie:
' i" h& C! i8 x+ N7 J" _ JavaScript中可通过document.cookie访问到所有Cookie:) }( T/ t) s4 M
"变量1=值1;变量2=值2;变量3=值3;"; @4 p2 U6 `0 l* f2 c
需经过串分解就可得到每一个变量名及值;
" E" _; _# x$ J' M/ d 2>写Cookie:1 v# m) D& d% P: y0 D8 p
email="bush@usa.com";
$ v4 k/ Q1 z) s7 w; l: v/ B firstname="jorge";
/ C- |; P/ l; H0 x% E' C6 N lastname="bush";
( N; K% C5 H( ^4 t! [1 M expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
( z0 h6 @( l. Y0 U document.cookie="email="+email+";expires="+expireDate;
) D: ?" |' y; T document.cookie="firstname="+firstname+";expires="+expireDate;
& U6 {/ Q9 P, Q7 a+ D, i2 z document.cookie="lastname="+lastname+";expires="+expireDate; - }/ u* L& i r7 B" [
下页一例,将网页的文本输入框域变量NAME自动保存下来: ' k r$ j- w: `
<script language="JavaScript">1 r9 }7 f8 r( Y# G) w
<!--
3 m. R& q5 j, i; g/ y U+ ifunction getValue(s,n) // 分解Cookie表达式s8 U) z6 F, E. M
{2 M6 e. l2 \7 W" o' @; \- ^
var pairs=s.split(";"); // 分解成串数组
2 L" S1 J# l+ [2 D I for (var i=0;i<pairs.length;i++)
' e" o8 ?( }. ]6 _2 m {# S8 X1 d# |4 g3 ]/ e1 q% w* v
var pairSplit=pairs.split("=");
7 U5 l% d0 j% M% y if (pairSplit[0]==n) file://查找n0 |5 l& j6 _5 ~
return pairSplit[1]; file://取到n的值
; ? D5 F6 ]+ v2 B0 ^+ n } " C: S2 i$ V' B; t/ o
return "";
- |* K$ ?8 O( y' o6 h}
, ^ X/ [2 b) v* C; X- efunction getName() file://取Cookie中的姓名NAME. Q" i( H- q$ k: O. l/ x! _
{
" A# N3 t+ ^4 f1 X2 R var s=document.cookie; // 取所保存的Cookie
/ a% @1 {) d e2 ?+ a2 U3 A& ` NAME0=getValue(s,"NAME");
! ?0 l. S' y3 x" F4 a5 ]/ j3 y4 d form1.NAME.value=NAME0;9 Z3 E0 x- x* {) `, ^9 C
}/ x4 c. k$ R6 S
function newCookie() file://将Cookie中存姓名
8 {/ h; N. E* V; f, z{
% i' y/ t9 B6 R/ R. u1 D7 O3 U var s=form1.NAME.value;7 v0 T) a. e: e+ R. t
if (s!="" && s!=NAME0) // 非空则保存( c n ?2 K$ i+ c. v. H
{5 k* {) q& J8 n5 K2 Q( A
s="NAME="+s;
. W* m1 P" ^* y) b9 R( ] s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
$ m B( T2 O$ [$ m6 F- k document.cookie=s; // 将保存到客户机中
0 r8 ~0 H1 Z w } W" S' S6 G* \1 d8 \
}
' q( b) N* f9 ?9 r S5 Afile://--></script>
' ^+ {; W1 D4 R# R3 e/ q0 s* D& z4 G..................
/ `; `! P. d: y<body bgcolor="#00FFFF" onload="getName();
) b$ b' e5 q4 z9 h( } p form1.TEXT.focus()" onunload="newCookie()">
3 z1 \1 Y! J7 I; L' I. U9 G<!进入本网页时将执行onload中的getName()>
) [" j4 o( }- N4 a, s e# \<!退出本网页时将执行onunload中的newCookie()>/ x6 G2 {2 A$ a+ ?8 L, l# w$ V
.................. " S* _2 a4 ~# ?6 q2 a) b9 J" V
三、BCB与Delphi中用ISAPI对Cookie的存取:
6 D5 c3 x2 e8 s; k( ? [注:Delphi用 .代替BCB的->]
# p2 M. r$ N4 _% x 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
+ c3 S; f0 _5 }. h' h它也可以读取与存入Cookie变量:
4 z& V: X4 L; F9 C% Q. _. X3 ` 假设处理用户提交的方法如下: # R" K- a$ e" E- i. E1 p
void __fastcall TWebModule1::WebModule1Action(TObject *Sender,
# \! k6 I# h4 x) l$ ^TWebRequest *Request, TWebResponse *Response, bool &Handled) 2 W$ ` x) S+ Z- ^8 U# _* u9 C
1>从客户机中读取Cookie:
" f7 R! z/ H% [ X/ E$ _7 e Request->CookieFields是个串数组TStrings *,如果不为
- r1 F+ w4 @8 Q( m+ u空,每一行都将是如下形式:
7 A2 b E1 D. m. N% L Cookie变量名=值5 g6 I2 c2 I- D( m( c, v) L% N& E
共有Request->CookieFields->Count个变量,
. D$ H2 k c7 [4 U% p( D4 l9 y变量名为Request->CookieFields->Names; (i>=0)
; `, A e' y( HReauest->CookieFields->Values["变量名"]就是对应的值;
) w- K8 e8 q# R1 F6 W请注意: 客户首次访问网页时,客户机中并不存在你将要设的
5 v; j5 h. F2 Y( QCookie变量,所以第一次Request->CookieFields将是空的;
! A3 I& \$ F) b 2>将Cookie变量保存客户机中:5 G8 |0 p$ i& z0 @% J( ?
TCookie *pNewCookie = Response->Cookies->Add();
5 @$ o' |7 J" i' Q- [1 t' A* V, J pNewCookie->Name="变量名1";5 W% d' @* Q4 R. H
pNewCookie->Value="值1";
; H& [7 H& d, `1 y! @) r$ ^9 e pNewCookie->Expires = Now()+366; // 保存一年: Q" A1 T& d' g( z
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; # v4 X1 u( i7 \5 x7 U# V1 m
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交
6 p% {) l# O9 j- p! o.DLL后,每刷新一次浏览器,将看到计数值将变化一次: 5 a# A9 d5 ]4 d4 L
void __fastcall TWebModule1::WebModule1WebActionItem1Action(
! V( N1 X& q! j$ k9 k( P# D TObject *Sender, TWebRequest *Request, TWebResponse *Response,
a. \ K1 C1 M u% I/ r' [2 H% o bool &Handled)
( r9 Y9 O/ X* V' ~( @4 k- Z' b$ R$ G9 T{/ K* P* n* Q. D1 H, V: ?
TStrings *cookies=Request->CookieFields;
$ o7 _2 N i, j! m+ B* U) a5 _ String oldvalue1=cookies->Values["count1"]; // 取count1旧值" k3 l! D6 l* q4 x
String oldvalue2=cookies->Values["count2"];
( A# B2 Z1 Y, B0 \4 k String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值
- P0 m9 t! K( C/ O String newvalue2=oldvalue2.ToIntDef(0)+100; 9 d% O; p5 J1 Y2 e* }. O3 p
TCookie *pNewCookie1 = Response->Cookies->Add();% a$ e0 h5 E5 \. e: r
pNewCookie1->Name="count1"; file://更新Cookie8 r% C( `8 j+ k9 k8 h( {2 O R( C
pNewCookie1->Value=newvalue1;
5 U' g2 e' @2 p4 M" Y pNewCookie1->Expires = Now()+366; // 保存一年 : \8 r* t# ^/ B- Y6 y9 _7 T: t
TCookie *pNewCookie2 = Response->Cookies->Add();
' I0 g: X. `: l0 I9 _+ u' w pNewCookie2->Name="count2"; file://更新Cookie b$ r1 T4 U0 ]
pNewCookie2->Value=newvalue2; O( f( B! q* m- J( k% _% J
pNewCookie2->Expires = Now()+31; // 保存一月
9 J8 k( G2 n, B! u4 b // 向客户显示Cookie的值/ S, o; b; l+ W8 E$ k5 x$ }3 ]; b
String h0="<html><head></head><body>";
" R% s- a7 ^0 v, _7 _ O String h1="</body></html>";; t6 {5 {2 d0 }0 g
String s1="计数值1="+newvalue1+"<br>";
0 |0 b! V3 Y# c9 M' C' g String s2="计数值2="+newvalue2+"<br>"; 2 s2 A% f( p0 e9 N
Response->Content=h0+s1+" <br>"+
: H3 f4 R4 \! c/ E9 t5 L s2+" <br>"+ h1;
; e% i. Q1 |$ x1 R) t: L} 6 @3 Y2 c; ]4 L
|