数学建模社区-数学中国

标题: Web变量Cookie的使用 [打印本页]

作者: 韩冰    时间: 2005-1-26 01:12
标题: Web变量Cookie的使用

[作者:扬州BCB]

' E/ u0 `3 _- s( O o. d# Q

一、 Cookie概述:

( _' V7 W, D5 E9 o3 v: j* e+ C

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。5 D* h* Q0 B( |& V# j Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 : u, J+ W) u* R# g4 {内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 ( h i% b2 i f: N测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量) C8 M, b5 b% f2 L2 w! d w6 | 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次: Y* _- R, b# C( Z/ k& e& Z" N( F 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 8 J/ b5 S: R: ~( I9 k页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 ' _) i! q! x& g4 f/ B) ?( |小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, & B& T7 X. J# o0 j G3 x& m5 e. F: ~' a使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

+ z' `, W1 a& Z* T

二、JavaScript脚本对Cookie变量的存取: 1 _, ]* A$ t1 H6 h JavaScript是运行在客户端的脚本程序,用它可将文本输入 2 K/ c" z* J* i9 d$ x框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 $ A; T2 P- Q5 I5 w. O微减轻Web服务器的一点负担:

$ C" w' ?, M/ Z% Q

1>读出Cookie: 6 I+ v9 s' M! q6 r6 D& f1 j JavaScript中可通过document.cookie访问到所有Cookie:$ B! r- }2 m6 A# ?5 C5 X "变量1=值1;变量2=值2;变量3=值3;" - |/ n/ b2 ~- c; G 需经过串分解就可得到每一个变量名及值; 4 j; R; B8 g& s+ p5 W 2>写Cookie: 5 [* E9 c {. z8 ? email="bush@usa.com"; * z' V' W: B6 B* S, g: k firstname="jorge"; 6 _2 A) W! r0 v( D1 g lastname="bush"; $ m2 R- y# T) V) M. w% Y 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; 7 Z' |1 _! Z7 C) I9 w- M document.cookie="lastname="+lastname+";expires="+expireDate; 2 _1 u; p4 ?$ B 下页一例,将网页的文本输入框域变量NAME自动保存下来:

- I9 R2 u8 Y, v9 W7 q

<script language="JavaScript"> 1 j4 I( f$ e m, M<!-- 6 T1 ^, Z; J! ^7 t0 bfunction getValue(s,n) // 分解Cookie表达式s- X, J m+ R& ] { : R* U$ \; E( T4 ?* V var pairs=s.split(";"); // 分解成串数组 ' H( E" G6 r. i3 F6 [ for (var i=0;i<pairs.length;i++) . b) v# Z7 s" P, U { ?( C5 ?7 F/ ~" M' _, i var pairSplit=pairs.split("="); ; j& m8 T5 i- g if (pairSplit[0]==n) file://查找n 6 ^+ Z( k/ R% [ 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 - `! X7 B! P5 W+ e) H NAME0=getValue(s,"NAME"); 8 D0 u: P$ d3 X8 Y form1.NAME.value=NAME0;8 @6 `& ^& K5 e* Q } 4 B4 j* }' X/ b+ z- B: nfunction newCookie() file://将Cookie中存姓名 ) q# J% k; i8 _5 W7 f1 J4 c; Q{$ z( a5 ~8 B3 O$ `# R$ m5 G var s=form1.NAME.value; 4 F. a: w1 i+ k& `9 `; H* K$ ` if (s!="" && s!=NAME0) // 非空则保存 * `: A& t8 Y0 }; ]+ z3 {& q. n9 z6 @ { 9 p% O$ [% `- D1 S s="NAME="+s;( c; S2 D G1 }% Z& s Y+ @: W s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; ) Q1 B1 i$ K x9 r# _. V document.cookie=s; // 将保存到客户机中6 c2 G( N- s! I } " x8 G' K0 g; M. ?$ J}- M5 ?5 U: I" o* b file://--></script>6 v: y& \( U# l& h! }* t @$ Y ..................

/ u- c* d' ]" w: A

<body bgcolor="#00FFFF" onload="getName(); n7 ]6 d/ K d% i/ Z6 j form1.TEXT.focus()" onunload="newCookie()"> 1 o e$ q. s$ H6 ~<!进入本网页时将执行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的->]

7 d% L/ ~; p: G9 u" g) ^) x! U) R7 S

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, $ m2 k2 r. Z( V4 }% l它也可以读取与存入Cookie变量:

3 a" U2 [+ S+ T l

假设处理用户提交的方法如下: / 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, G

1>从客户机中读取Cookie: ) @5 W* H. t' b Request->CookieFields是个串数组TStrings *,如果不为6 `' x7 Q0 l( \! |6 c4 o 空,每一行都将是如下形式: ) ]% ~7 p B( ], E8 F0 z j 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["变量名"]就是对应的值; / P( G7 v3 B& L1 P% \- i X请注意: 客户首次访问网页时,客户机中并不存在你将要设的 # i8 p3 ]0 N, X$ p9 H% eCookie变量,所以第一次Request->CookieFields将是空的;

/ z* ]. R9 ?0 z, B8 |: f3 v2 Y

2>将Cookie变量保存客户机中: . P3 d; v( s( {, h, ? 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"; 8 E! K) m+ {( d X 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后,每刷新一次浏览器,将看到计数值将变化一次:

- D# _5 b+ e. N) z: Q5 h4 _

void __fastcall TWebModule1::WebModule1WebActionItem1Action( 0 z1 T& {; M. R) \ TObject *Sender, TWebRequest *Request, TWebResponse *Response,5 X c2 t* a- u! ^4 V' y bool &Handled) . i2 z& \" j( N5 { K{ 5 _& O) F. p" p" V TStrings *cookies=Request->CookieFields;/ ~# e1 _4 f" K& l String oldvalue1=cookies->Values["count1"]; // 取count1旧值 5 I+ u& R! r$ k W/ }. {7 G String oldvalue2=cookies->Values["count2"];

8 F) d6 Z2 |& U* }1 i5 i

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 |2 w% Z& v9 Y3 J String newvalue2=oldvalue2.ToIntDef(0)+100;

i h; t' i, r- d

TCookie *pNewCookie1 = Response->Cookies->Add(); 4 m# K. i; H: S! l pNewCookie1->Name="count1"; file://更新Cookie , v- h5 r& S8 l6 I- e! t; F pNewCookie1->Value=newvalue1; & k! b: y: Z& R/ ^$ _7 C* d( b0 R pNewCookie1->Expires = Now()+366; // 保存一年

' ^4 q T- Y. Q! p6 L" d

TCookie *pNewCookie2 = Response->Cookies->Add(); 3 B. q2 y6 O" z 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>"; . r- A0 O1 ~) j t4 C String h1="</body></html>"; 6 t5 M: s8 O9 U/ i6 @ 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