[作者:扬州BCB]
' E/ u0 `3 _- s( O o. d# Q一、 Cookie概述:
要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。5 D* h* Q0 B( |& V# j Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量) C8 M, b5 b% f2 L2 w! d w6 | 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次: Y* _- R, b# C( Z/ k& e& Z" N( F 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
+ z' `, W1 a& Z* T二、JavaScript脚本对Cookie变量的存取: JavaScript是运行在客户端的脚本程序,用它可将文本输入 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 微减轻Web服务器的一点负担:
1>读出Cookie: JavaScript中可通过document.cookie访问到所有Cookie:$ B! r- }2 m6 A# ?5 C5 X "变量1=值1;变量2=值2;变量3=值3;" 需经过串分解就可得到每一个变量名及值; 2>写Cookie: email="bush@usa.com"; firstname="jorge"; lastname="bush"; expireDate="Thursday,01-Jan-2099 12:00:00 GMT";7 ` A! b7 N7 b. J, R document.cookie="email="+email+";expires="+expireDate;8 ]; K D7 g/ ? document.cookie="firstname="+firstname+";expires="+expireDate; document.cookie="lastname="+lastname+";expires="+expireDate; 下页一例,将网页的文本输入框域变量NAME自动保存下来:
- I9 R2 u8 Y, v9 W7 q<script language="JavaScript"> <!-- function getValue(s,n) // 分解Cookie表达式s- X, J m+ R& ] { var pairs=s.split(";"); // 分解成串数组 for (var i=0;i<pairs.length;i++) { var pairSplit=pairs.split("="); if (pairSplit[0]==n) file://查找n return pairSplit[1]; file://取到n的值4 \4 w; c6 Y- i7 l7 s } ! ]& L6 J6 x" r1 [; @; w6 ^ return "";# E5 b8 K1 c6 R* c( |# @ }4 y& d" Z" Z: c7 t function getName() file://取Cookie中的姓名NAME* i$ {+ G1 x! ]+ o& I {; W' |' w9 t. O) M var s=document.cookie; // 取所保存的Cookie NAME0=getValue(s,"NAME"); form1.NAME.value=NAME0;8 @6 `& ^& K5 e* Q } function newCookie() file://将Cookie中存姓名 {$ z( a5 ~8 B3 O$ `# R$ m5 G var s=form1.NAME.value; if (s!="" && s!=NAME0) // 非空则保存 { s="NAME="+s;( c; S2 D G1 }% Z& s Y+ @: W s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; document.cookie=s; // 将保存到客户机中6 c2 G( N- s! I } }- M5 ?5 U: I" o* b file://--></script>6 v: y& \( U# l& h! }* t @$ Y ..................
<body bgcolor="#00FFFF" onload="getName(); n7 ]6 d/ K d% i/ Z6 j form1.TEXT.focus()" onunload="newCookie()"> <!进入本网页时将执行onload中的getName()># e: T Z* z% [8 \2 M <!退出本网页时将执行onunload中的newCookie()>2 M, Y1 W; s8 G2 Q( s* e ..................
2 _4 R9 h) G3 U* n: w9 W4 d三、BCB与Delphi中用ISAPI对Cookie的存取:( S7 N J! h: R7 U" F& q" }6 p [注:Delphi用 .代替BCB的->]
与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, 它也可以读取与存入Cookie变量:
假设处理用户提交的方法如下: / I2 l) K* q8 e- q1 n/ F& S void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 2 b2 ~8 X L9 ^6 ]1 P7 Y TWebRequest *Request, TWebResponse *Response, bool &Handled)
\4 p4 J" p6 z2 _" k& A+ f9 Z' h( w, G1>从客户机中读取Cookie: Request->CookieFields是个串数组TStrings *,如果不为6 `' x7 Q0 l( \! |6 c4 o 空,每一行都将是如下形式: Cookie变量名=值! j: T( i3 z4 q) C 共有Request->CookieFields->Count个变量,% l z, ]+ o, {* h& s 变量名为Request->CookieFields->Names; (i>=0)" N$ A9 y! p# H Reauest->CookieFields->Values["变量名"]就是对应的值; 请注意: 客户首次访问网页时,客户机中并不存在你将要设的 Cookie变量,所以第一次Request->CookieFields将是空的;
2>将Cookie变量保存客户机中: TCookie *pNewCookie = Response->Cookies->Add();& b- y0 E6 H1 A3 Y/ ?: v; W pNewCookie->Name="变量名1";: p# ]8 m$ ?' b2 M* n$ M& J3 @% w% t2 m pNewCookie->Value="值1"; pNewCookie->Expires = Now()+366; // 保存一年6 p5 x. M& H" k( r# Y, z+ } 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
( V" t! I8 }* }* v) k3 \举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交" z1 ^8 C2 X; Q' | .DLL后,每刷新一次浏览器,将看到计数值将变化一次:
void __fastcall TWebModule1::WebModule1WebActionItem1Action( TObject *Sender, TWebRequest *Request, TWebResponse *Response,5 X c2 t* a- u! ^4 V' y bool &Handled) { TStrings *cookies=Request->CookieFields;/ ~# e1 _4 f" K& l String oldvalue1=cookies->Values["count1"]; // 取count1旧值 String oldvalue2=cookies->Values["count2"];
String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 String newvalue2=oldvalue2.ToIntDef(0)+100;
i h; t' i, r- dTCookie *pNewCookie1 = Response->Cookies->Add(); pNewCookie1->Name="count1"; file://更新Cookie pNewCookie1->Value=newvalue1; pNewCookie1->Expires = Now()+366; // 保存一年
TCookie *pNewCookie2 = Response->Cookies->Add(); pNewCookie2->Name="count2"; file://更新Cookie 4 G/ f, h0 g1 l, w$ A pNewCookie2->Value=newvalue2;: l! X) O# u$ r- ~: c pNewCookie2->Expires = Now()+31; // 保存一月
( o4 |7 ~4 r- R" l) j// 向客户显示Cookie的值8 m' A' U( V8 ?3 p String h0="<html><head></head><body>"; String h1="</body></html>"; String s1="计数值1="+newvalue1+"<br>";, h1 f: B& j# p( N0 B) {- s String s2="计数值2="+newvalue2+"<br>";
3 I3 {. |1 J i3 L7 n4 }1 n- i# @Response->Content=h0+s1+" <br>"+' g- T6 r2 v0 Z" ~8 V) I2 q' H s2+" <br>"+ h1;$ h/ `. V Q+ c& @ } $ K4 I/ C* C; B9 U) b; `
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |