数学建模社区-数学中国

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

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

[作者:扬州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(意为小甜饼)就是在客户浏览网站时网页保存在客户机 - I, H- t7 h5 K7 {$ a7 Q, k内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 " x& g0 N4 V$ d7 D测,其实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变量的存取: 8 v% I+ E# l3 k+ D+ J JavaScript是运行在客户端的脚本程序,用它可将文本输入8 v1 {+ f H* T9 X9 i+ W 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍, T! o4 N0 a" w* c9 C/ w2 Q 微减轻Web服务器的一点负担:

8 n8 y( \& E* K. {8 k; u

1>读出Cookie: ; g; b) T9 l1 R- m5 X JavaScript中可通过document.cookie访问到所有Cookie: * L/ b8 P8 @! T "变量1=值1;变量2=值2;变量3=值3;" " p: h# r' A( Q1 z 需经过串分解就可得到每一个变量名及值;( r: @, g& q- @% d6 Y. } 2>写Cookie: 8 o. p, h5 ]4 y. `$ G 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"; ; ~! \+ f' g$ F, c document.cookie="email="+email+";expires="+expireDate; " Z+ [% U8 \9 @* O4 w% c document.cookie="firstname="+firstname+";expires="+expireDate; ! y% ?9 N$ R1 U, c+ C document.cookie="lastname="+lastname+";expires="+expireDate; 7 F! A3 t( C( g& l- w, D 下页一例,将网页的文本输入框域变量NAME自动保存下来:

. s; ?! H g4 G! ^9 ^

<script language="JavaScript">& W# S! {) o/ ?, ?; O <!--. Q9 E: p9 v) [. [ function getValue(s,n) // 分解Cookie表达式s / S" O; r, v9 h/ S& \, m! B{$ x( Y; X6 G. E2 d8 S& {' }9 d var pairs=s.split(";"); // 分解成串数组 4 ]- O' G4 L0 O. C 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("="); . j* C' T9 I$ C1 d7 D if (pairSplit[0]==n) file://查找n$ ?' Z4 A5 M2 ]/ x0 M return pairSplit[1]; file://取到n的值 ; M u- @7 g' T, @ } * U- A( R+ Q$ |) k& I+ F return ""; T+ f/ p M |3 \; S}- S0 ?' F' M/ D7 G function getName() file://取Cookie中的姓名NAME $ U/ g. @. \0 \/ |7 K{$ 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; , G. `) K- ]3 q) q T3 Z! [. E} 5 ?& Q2 r5 r% a* r5 Afunction newCookie() file://将Cookie中存姓名 3 H+ ]# l5 H" F) S+ u! ]: _{ ! U/ b/ l5 r2 v& B4 P( i" u var s=form1.NAME.value; 9 \, ]( t9 ^! i( F( k% Y if (s!="" && s!=NAME0) // 非空则保存) o) t1 l8 I0 @/ z$ Q& n {2 [+ {" {; _/ L8 r s="NAME="+s; 7 w1 Q% U: O- _4 G) ?$ U s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; 3 Q- \9 U# Q( w document.cookie=s; // 将保存到客户机中 ' S! s$ w& |. O6 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 ..................

' Z2 Y; z5 C9 D. j; g

<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()> O1 p& A0 C0 W4 l' c2 ]<!退出本网页时将执行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的存取: % m* D+ E+ i+ H% S; y' l [注:Delphi用 .代替BCB的->]

+ C7 z& @% X& @+ C

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,& E' O& `* U) U 它也可以读取与存入Cookie变量:

7 p, P1 s2 {/ p9 H7 C1 A/ S

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

1>从客户机中读取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["变量名"]就是对应的值; ! O4 p6 J% F4 X; P* q请注意: 客户首次访问网页时,客户机中并不存在你将要设的 ' }0 g0 t3 a6 Z; lCookie变量,所以第一次Request->CookieFields将是空的;

r- i/ p; h" O% d6 l

2>将Cookie变量保存客户机中: : q6 |2 S, k- k. @ f0 H8 v 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; // 保存一年 3 K+ k" G/ A; g就可设定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 y

void __fastcall TWebModule1::WebModule1WebActionItem1Action(. ]) l" p( D6 T/ j; l% X* i1 n3 J TObject *Sender, TWebRequest *Request, TWebResponse *Response, 4 P/ p9 A: @) x8 q1 ?" I: Z bool &Handled)- @. k9 l6 l& z0 E { 9 V) Z9 [; [0 L" v 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"];

- P8 C6 [! i0 c0 Y5 x7 R

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值3 e2 Z# Y% ~) @7 g& r4 |, r String newvalue2=oldvalue2.ToIntDef(0)+100;

+ f8 |/ l3 _7 p# v' @) g

TCookie *pNewCookie1 = Response->Cookies->Add();$ R$ s5 ~' j3 H& ? pNewCookie1->Name="count1"; file://更新Cookie & _$ k7 E2 n; k4 F( i: j+ t, e9 T pNewCookie1->Value=newvalue1; U7 m3 w/ `# |8 V/ ?* ]: d pNewCookie1->Expires = Now()+366; // 保存一年

* I+ C. j1 @2 `2 i* W

TCookie *pNewCookie2 = Response->Cookies->Add(); $ q: l- Z4 I) `7 n pNewCookie2->Name="count2"; file://更新Cookie 1 n$ A% i; P4 i; Q$ j2 b9 Z1 @* @ pNewCookie2->Value=newvalue2; 1 d8 k4 |3 W* R& } pNewCookie2->Expires = Now()+31; // 保存一月

, y7 \8 g* J# q) D' }

// 向客户显示Cookie的值5 L" t# m4 @3 H! G$ l String h0="<html><head></head><body>"; 0 X3 x! R8 I3 z String h1="</body></html>"; 9 k* {' u" L. ~" E String s1="计数值1="+newvalue1+"<br>";2 x9 Z' R5 Q" n- l2 ?) A; T+ @ String s2="计数值2="+newvalue2+"<br>";

: t/ j0 h$ z! v

Response->Content=h0+s1+" <br>"+! _2 C: w+ f) I: l' y( D* { s2+" <br>"+ h1; - i1 s% h! d0 _} * [9 a5 j- T$ S" }- u






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5