|
[作者:扬州BCB]
, [! _. y1 t& R! B6 ?# B( z- ~ 一、 Cookie概述: 2 c+ _/ V; B0 f7 j
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。2 J0 Y3 N$ j, w, y" Q( u
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机1 N2 P5 T; s0 k- P( W
内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可, l0 }" r- f- J/ |7 m7 _
测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量2 u8 G' R, _6 r- g; w
的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
- d' F( p0 `; U0 y, h' ?所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
$ z- ?* ^+ G! E" [/ `页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫3 T0 G- R+ d. }- l" f, K6 Q
小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,; r" Q* E* J: F8 u. d/ {, B6 p
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容; & C4 w$ {( u& v
二、JavaScript脚本对Cookie变量的存取:
4 G5 Q% V2 q/ {( T Y4 j JavaScript是运行在客户端的脚本程序,用它可将文本输入- N9 N/ R0 Q' S0 @; V
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍' r3 o1 Z; f8 [: D: a7 Z
微减轻Web服务器的一点负担: ; W2 ~& ], t: D: F7 J, Y
1>读出Cookie:( |: Q' i# S& l* U. v. v
JavaScript中可通过document.cookie访问到所有Cookie:- S9 U& E2 q9 x7 ?
"变量1=值1;变量2=值2;变量3=值3;"
0 P' ? j/ H0 Y( t! U( a 需经过串分解就可得到每一个变量名及值;
q& @' I/ w' f. G) ] 2>写Cookie:0 Y; w7 z1 N9 `
email="bush@usa.com";4 ]) Q2 p5 X! V% s; [5 c
firstname="jorge";
, e4 a) q% m. D6 f lastname="bush";7 ~, R J9 [) Q
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";) u) s+ `, U: d+ u: T
document.cookie="email="+email+";expires="+expireDate;
$ S: c, f8 L8 s, q' `9 |% b: ~ document.cookie="firstname="+firstname+";expires="+expireDate;
5 W/ I! o1 i9 x+ j3 F document.cookie="lastname="+lastname+";expires="+expireDate;
: k2 w9 i2 A0 |( z- X 下页一例,将网页的文本输入框域变量NAME自动保存下来:
; }4 E y2 `! U/ o<script language="JavaScript">9 g) g8 g7 Y! H2 d
<!--
2 Z* a- b" `6 L1 afunction getValue(s,n) // 分解Cookie表达式s
8 S# f& U+ f8 [( O4 S C* I) c{
' N) `( z1 G6 P7 k# L var pairs=s.split(";"); // 分解成串数组; R, p; n2 q3 J& a- i: v* L; F/ ^
for (var i=0;i<pairs.length;i++)
9 ^# p* R2 f$ ~# V {* j' O* m; Z% _/ A' r
var pairSplit=pairs.split("=");
0 @, u6 V8 G3 x$ @ if (pairSplit[0]==n) file://查找n8 T# s, `& V3 f
return pairSplit[1]; file://取到n的值
' m% }& Z) ^+ k% o/ { } 0 Y9 \% F; V: ]8 O" k
return "";
8 U' b# B; s" E}; w% T1 B% b) w# j$ m2 T
function getName() file://取Cookie中的姓名NAME
$ o+ s8 j3 k3 w{
* f' n# X8 G& T! A( X2 K var s=document.cookie; // 取所保存的Cookie
6 V4 _* @, N1 v. s' w$ E ~% ^ NAME0=getValue(s,"NAME");# u7 s5 F, V9 k& Q2 O) i
form1.NAME.value=NAME0;
( p. a1 t. J m! Z}0 L7 K. [! R# N
function newCookie() file://将Cookie中存姓名, _0 o% U% g( z. d+ E7 B
{
7 E% A7 {" R! n- c var s=form1.NAME.value;
! Z( V* G& j2 a+ G if (s!="" && s!=NAME0) // 非空则保存/ f& y- W. L/ Q% V/ J
{$ ~, }; x5 b! L; ~0 |2 ?
s="NAME="+s;
& `. T% E9 F& _( ~9 E: u9 {5 D s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";
- o% {# z% M P9 z+ n7 t) @ document.cookie=s; // 将保存到客户机中
0 @) @" H) K8 m& _+ ~ }
: |' t$ Y8 L* k1 X}" s0 `. e( H9 M) A L2 o; _2 a
file://--></script>! m. h) P3 W5 ?+ u8 g" O u+ p% B9 T
..................
# d A( m- y# O8 D2 N' M0 V<body bgcolor="#00FFFF" onload="getName();
& b/ Q3 ~$ u6 Y$ V- T0 _1 Q form1.TEXT.focus()" onunload="newCookie()">7 Y- {. o, V/ Z6 [: k
<!进入本网页时将执行onload中的getName()>
6 s4 R- p5 O0 \9 g<!退出本网页时将执行onunload中的newCookie()>* T( a0 M+ m2 H$ m( d
..................
, T8 O, }; y8 @9 m3 u 三、BCB与Delphi中用ISAPI对Cookie的存取:
2 h! L3 Z) w, c/ } [注:Delphi用 .代替BCB的->]
, |9 l+ @* C& K( q, [% M+ w 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
6 K1 o; ?0 j0 V$ I" a3 ? N它也可以读取与存入Cookie变量:
+ A# r& d+ b0 L; l$ |, g 假设处理用户提交的方法如下: ( x* M. m4 ~! X
void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 6 ~1 \2 d3 K/ ]$ B7 G7 Q+ C1 Z
TWebRequest *Request, TWebResponse *Response, bool &Handled) 4 c1 U' o( n6 y( B; g3 Y: j: t
1>从客户机中读取Cookie:
$ \0 Y5 u4 ?1 V7 f Request->CookieFields是个串数组TStrings *,如果不为
5 Q4 y& @+ N f; @9 J空,每一行都将是如下形式:
; V' ^( C% s+ k/ p0 G: f Cookie变量名=值
, p- d- u& f1 U( s共有Request->CookieFields->Count个变量,( R/ s' G/ }1 O* a1 y
变量名为Request->CookieFields->Names; (i>=0)7 q' [; R. g p" K3 W, |( \% D- ?
Reauest->CookieFields->Values["变量名"]就是对应的值;+ Q8 `4 K3 R* O' c2 W, J
请注意: 客户首次访问网页时,客户机中并不存在你将要设的0 G! q9 [# a* F" H$ b6 @
Cookie变量,所以第一次Request->CookieFields将是空的;
7 I8 e! l" x# d6 R1 s 2>将Cookie变量保存客户机中:4 c4 e7 h* ~! X; M
TCookie *pNewCookie = Response->Cookies->Add();
4 h, u2 B. J% p: v9 y9 J. P pNewCookie->Name="变量名1";
. r. O% a4 d5 e( { pNewCookie->Value="值1";
9 k) K2 B8 R1 N pNewCookie->Expires = Now()+366; // 保存一年, W& e* r& M6 M* a9 X" {! h
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量; 3 x3 l2 J- H Z5 g1 B) B
举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交) x6 \6 t2 h' p- @, p
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
+ e4 ~! ~7 F& k l/ w2 [; O0 h1 ?void __fastcall TWebModule1::WebModule1WebActionItem1Action(
( c: i& x1 S% v% A/ G TObject *Sender, TWebRequest *Request, TWebResponse *Response, b7 Z/ c1 P: O
bool &Handled)
7 A7 l4 v. H ^9 l7 ?5 N M{
9 u- {: B' C% K- d- x( ?. } TStrings *cookies=Request->CookieFields;
! e4 N! P' q& D) F' m String oldvalue1=cookies->Values["count1"]; // 取count1旧值
& z( @. T) i& g9 z' R. \, | String oldvalue2=cookies->Values["count2"]; 5 i+ R7 H6 W$ T3 r3 |* F8 j" Q
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值3 ` z4 g: z4 }4 S" R5 C
String newvalue2=oldvalue2.ToIntDef(0)+100; 5 C. F" B" p( R6 q! y
TCookie *pNewCookie1 = Response->Cookies->Add();% R4 V' ?' v' _0 g3 D8 ]
pNewCookie1->Name="count1"; file://更新Cookie6 @5 b9 t# S4 `* q
pNewCookie1->Value=newvalue1;
' o. p* z- m; y1 y! b pNewCookie1->Expires = Now()+366; // 保存一年
! ]6 c% Q) ]7 y0 { TCookie *pNewCookie2 = Response->Cookies->Add();
+ K" q3 J1 F" p( B/ d pNewCookie2->Name="count2"; file://更新Cookie 9 {! H9 e! t5 Z0 ]4 z- O
pNewCookie2->Value=newvalue2;
8 f/ W! K" [' E0 p( {$ V pNewCookie2->Expires = Now()+31; // 保存一月 5 y. o, `) w8 b" D" w
// 向客户显示Cookie的值8 H6 K( F& M- U4 x8 x' A+ g
String h0="<html><head></head><body>";, S% J5 C7 m0 t! L& R6 d
String h1="</body></html>";8 I: i4 H0 I3 K" p% S- o
String s1="计数值1="+newvalue1+"<br>";/ n4 J/ l# N( a( J3 x, q
String s2="计数值2="+newvalue2+"<br>"; ( n- b8 r: P$ p) f8 C7 J4 j
Response->Content=h0+s1+" <br>"+5 O0 g6 a* Z! N1 w$ G. u
s2+" <br>"+ h1;
5 ^" A5 r* ]4 b} 5 J( I& v* n7 l* k
|