[作者:扬州BCB]
7 p* Y0 w* z1 V" b# P一、 Cookie概述:
9 U: {3 f* t: Z* d" r要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。, e, j& q' h s8 X4 Q8 M k0 k Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量9 G4 c$ t5 n5 u( S: w 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次+ j3 j1 n; @# z$ ?2 q# X& X# Y 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网. S D) \1 }9 |+ U9 X 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫! n, l G# G, n i: z2 W 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,3 o; d# l1 e- c; { 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
* k$ c6 q2 C* t+ w# b二、JavaScript脚本对Cookie变量的存取: JavaScript是运行在客户端的脚本程序,用它可将文本输入8 v1 {+ f H* T9 X9 i+ W 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍, T! o4 N0 a" w* c9 C/ w2 Q 微减轻Web服务器的一点负担:
1>读出Cookie: JavaScript中可通过document.cookie访问到所有Cookie: "变量1=值1;变量2=值2;变量3=值3;" 需经过串分解就可得到每一个变量名及值;( r: @, g& q- @% d6 Y. } 2>写Cookie: email="bush@usa.com";+ n4 _- W- D' ?( Y3 G6 ] firstname="jorge";8 K* X1 Q* u5 ] lastname="bush";$ a! n1 r1 @) ]" |; N expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; document.cookie="email="+email+";expires="+expireDate; document.cookie="firstname="+firstname+";expires="+expireDate; document.cookie="lastname="+lastname+";expires="+expireDate; 下页一例,将网页的文本输入框域变量NAME自动保存下来:
. s; ?! H g4 G! ^9 ^<script language="JavaScript">& W# S! {) o/ ?, ?; O <!--. Q9 E: p9 v) [. [ function getValue(s,n) // 分解Cookie表达式s {$ x( Y; X6 G. E2 d8 S& {' }9 d var pairs=s.split(";"); // 分解成串数组 for (var i=0;i<pairs.length;i++)( P# s6 o4 t0 l; S {. K, P! X+ y- ?+ l4 L X& B3 l var pairSplit=pairs.split("="); if (pairSplit[0]==n) file://查找n$ ?' Z4 A5 M2 ]/ x0 M return pairSplit[1]; file://取到n的值 } return ""; }- S0 ?' F' M/ D7 G function getName() file://取Cookie中的姓名NAME {$ d% t5 |) I% q) f8 Y( { var s=document.cookie; // 取所保存的Cookie0 x* @+ l: O I: O" I/ t* { NAME0=getValue(s,"NAME");8 h) d3 L5 C6 K* z9 s7 Y form1.NAME.value=NAME0; } function newCookie() file://将Cookie中存姓名 { var s=form1.NAME.value; if (s!="" && s!=NAME0) // 非空则保存) o) t1 l8 I0 @/ z$ Q& n {2 [+ {" {; _/ L8 r s="NAME="+s; s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; document.cookie=s; // 将保存到客户机中 } & @- C0 D$ e; |7 m/ C! R* E& E, u }% m4 p: |. j0 J- o7 s* e( O file://--></script>; W9 \2 n% K3 ?1 [- `- ]. Q$ o ..................
<body bgcolor="#00FFFF" onload="getName();1 c/ x7 W# q3 d0 ?1 h form1.TEXT.focus()" onunload="newCookie()">5 V2 v; D$ \' ~3 i6 ` D; B <!进入本网页时将执行onload中的getName()> <!退出本网页时将执行onunload中的newCookie()>2 J7 I( j3 A8 a' l3 Y ..................
6 e' W e1 |6 D8 b- [0 C! O' N三、BCB与Delphi中用ISAPI对Cookie的存取: [注:Delphi用 .代替BCB的->]
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,& E' O& `* U) U 它也可以读取与存入Cookie变量:
假设处理用户提交的方法如下: 8 W6 I1 B! e7 ~8 p void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 5 S L, W+ M9 V, ]9 a( j TWebRequest *Request, TWebResponse *Response, bool &Handled)
# t) I- P! w( [: ^9 t* p1>从客户机中读取Cookie: % y, b9 p) B, g: a1 a) K Request->CookieFields是个串数组TStrings *,如果不为: O% a0 m. G9 e k" r/ G! ?1 _0 k. N 空,每一行都将是如下形式:& H6 L( P4 N+ [5 [3 w0 h2 O! n6 u6 m Cookie变量名=值- n: z- f/ q( \# P' H# D4 r/ e 共有Request->CookieFields->Count个变量,3 L9 V9 z0 {) ]9 B" L 变量名为Request->CookieFields->Names; (i>=0)9 M# e2 S. q7 e" G% O Reauest->CookieFields->Values["变量名"]就是对应的值; 请注意: 客户首次访问网页时,客户机中并不存在你将要设的 Cookie变量,所以第一次Request->CookieFields将是空的;
r- i/ p; h" O% d6 l2>将Cookie变量保存客户机中: TCookie *pNewCookie = Response->Cookies->Add();4 v# L$ I& ^5 J2 U0 O$ q; z pNewCookie->Name="变量名1";# h: \/ q) j( w% t( @ pNewCookie->Value="值1";; J8 C& @) C, C% }' s pNewCookie->Expires = Now()+366; // 保存一年 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
. k; s1 [* N8 X1 w& w4 F, z举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交" J6 \4 Z- y L2 b5 G3 o! N, B .DLL后,每刷新一次浏览器,将看到计数值将变化一次:
! a2 }$ j+ G( [3 e* S4 o Q9 yvoid __fastcall TWebModule1::WebModule1WebActionItem1Action(. ]) l" p( D6 T/ j; l% X* i1 n3 J TObject *Sender, TWebRequest *Request, TWebResponse *Response, bool &Handled)- @. k9 l6 l& z0 E { TStrings *cookies=Request->CookieFields;! G3 y5 A. E0 m5 @ String oldvalue1=cookies->Values["count1"]; // 取count1旧值) ]+ K3 s; ~; w) j, D2 h String oldvalue2=cookies->Values["count2"];
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值3 e2 Z# Y% ~) @7 g& r4 |, r String newvalue2=oldvalue2.ToIntDef(0)+100;
TCookie *pNewCookie1 = Response->Cookies->Add();$ R$ s5 ~' j3 H& ? pNewCookie1->Name="count1"; file://更新Cookie pNewCookie1->Value=newvalue1; pNewCookie1->Expires = Now()+366; // 保存一年
TCookie *pNewCookie2 = Response->Cookies->Add(); pNewCookie2->Name="count2"; file://更新Cookie 1 n$ A% i; P4 i; Q$ j2 b9 Z1 @* @ pNewCookie2->Value=newvalue2; pNewCookie2->Expires = Now()+31; // 保存一月
// 向客户显示Cookie的值5 L" t# m4 @3 H! G$ l String h0="<html><head></head><body>"; String h1="</body></html>"; String s1="计数值1="+newvalue1+"<br>";2 x9 Z' R5 Q" n- l2 ?) A; T+ @ String s2="计数值2="+newvalue2+"<br>";
Response->Content=h0+s1+" <br>"+! _2 C: w+ f) I: l' y( D* { s2+" <br>"+ h1; } * [9 a5 j- T$ S" }- u
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |