QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2472|回复: 0
打印 上一主题 下一主题

Web变量Cookie的使用

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:12 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

[作者:扬州BCB]

# y6 R5 `. H5 G; R& Y4 i8 a# r

一、 Cookie概述:

* e* I4 G3 B. W2 l

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 4 C8 P: T) w z! l0 Z5 S Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机& @5 \+ a% z2 e: b3 C. n& Q4 d) i 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可) @0 A% e, H% z( _% e- x/ ~( \ 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 , i1 h" c- _, Z( h* `的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 % E. W" v& v& Z G* s; H! O所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网! }7 j& x- f p& i 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫2 o/ s3 p2 ^# i! I6 n8 P 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,8 Q( ?6 r' M7 v J 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

4 _0 g% f b* Z, q

二、JavaScript脚本对Cookie变量的存取:3 Z9 `2 X( J" _ JavaScript是运行在客户端的脚本程序,用它可将文本输入 5 v$ y* b, V; D* _! Z框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍1 q9 p7 d" a5 N* x, s5 {0 s 微减轻Web服务器的一点负担:

$ e3 d) q+ Z- @; b' O# r) n

1>读出Cookie: , |, _) g. C; t; l JavaScript中可通过document.cookie访问到所有Cookie:9 d v; s- h. ^8 J "变量1=值1;变量2=值2;变量3=值3;" 4 G. x# y. G( ~) `; _, z- m 需经过串分解就可得到每一个变量名及值; 4 \ i3 L5 s0 l+ @ 2>写Cookie:) I) S- k+ |' S9 i email="bush@usa.com";4 u% _& G) ?5 M; Y. d1 I firstname="jorge"; 3 X: [7 j: j5 ^ lastname="bush"; 9 N/ s# r) u: G% K/ y- p expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; 4 S0 W$ `6 @ N( k. ~# g, G( K document.cookie="email="+email+";expires="+expireDate; 6 \: Z |: [) a, T0 q: x9 ] document.cookie="firstname="+firstname+";expires="+expireDate; 3 _* p: \% t# {: x! F/ z document.cookie="lastname="+lastname+";expires="+expireDate; 3 C7 ~9 ]7 m2 f' Q k 下页一例,将网页的文本输入框域变量NAME自动保存下来:

' A% [* h1 A& M6 W) N1 _; I/ f

<script language="JavaScript">( J8 _9 K1 Y3 y+ j <!--9 ~" S M" T* P! b( G) X- i' }, B function getValue(s,n) // 分解Cookie表达式s% H, ?, ~2 z9 r* _7 h { & h+ Z: |; e+ Z, E3 T- E7 E! C var pairs=s.split(";"); // 分解成串数组 ) _9 v, {" N5 X& _8 z for (var i=0;i<pairs.length;i++) I* Z, L% |1 b! n9 p { ! B- E% D& t# d, T! L var pairSplit=pairs.split("="); 6 \* I& ^$ E5 H if (pairSplit[0]==n) file://查找n 3 C" K1 b' Q) T0 Q: i5 B9 ` return pairSplit[1]; file://取到n的值; O1 ^, t3 u) O5 y ?2 q } / F" G1 R- {" |' x9 ~% z) y7 O' ~ return ""; " Z4 w( k1 ?! c9 r+ I5 M}5 [" _& c% P, {" F/ j; j. \- y$ Y function getName() file://取Cookie中的姓名NAME # @: Q7 O0 s% E% O, G2 s{( Q3 S3 Z8 ] K2 F: q var s=document.cookie; // 取所保存的Cookie( g( \, s3 j( A, p0 Z, G NAME0=getValue(s,"NAME");9 |' A* p" x. H0 M0 u# K form1.NAME.value=NAME0;: h# J( O+ s0 u$ |* q6 s! _3 N* b: F } 1 O& `1 [6 e+ [4 s- M7 O- D% `function newCookie() file://将Cookie中存姓名 ' M& r1 i' r7 w. Q$ Q2 M{ 4 _: g6 E' N& y# Z9 O) _$ S var s=form1.NAME.value;" e9 \ e) N' l& P: S/ i if (s!="" && s!=NAME0) // 非空则保存 z, R$ I7 m+ J3 j/ l- n; b7 j {- d& @* U( g X: A) `: y s="NAME="+s; 6 I4 Y( x# c3 u, p/ K) v s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";+ l, | Z: N" Y document.cookie=s; // 将保存到客户机中+ y+ {9 z1 i, T( y$ A n/ _: A: n/ J# U } 5 t! c: i& R5 l7 z} # ]; \/ n( j1 J8 Dfile://--></script>( i+ P0 a9 f; e7 w4 W8 _6 y ..................

' L2 R8 Q/ f5 m# O

<body bgcolor="#00FFFF" onload="getName(); * A1 ]; k3 l! K- {; Q, l0 q form1.TEXT.focus()" onunload="newCookie()">% `6 J" s! T' ~ <!进入本网页时将执行onload中的getName()> 2 q' m% z+ S L0 j5 P! d8 H<!退出本网页时将执行onunload中的newCookie()>' c9 ~0 _ C2 `, C# @' K ..................

$ b) d, S% B3 y2 E2 w. D

三、BCB与Delphi中用ISAPI对Cookie的存取:# G, M0 I; R+ k) l) g [注:Delphi用 .代替BCB的->]

" D8 d: z& W) j+ Q3 G6 i- W f5 y: B

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,& J; O1 q+ I5 Z 它也可以读取与存入Cookie变量:

3 o _# h; K/ h2 o

假设处理用户提交的方法如下: + ^2 H* J" K2 a void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 8 j3 [6 X6 Y. OTWebRequest *Request, TWebResponse *Response, bool &Handled)

$ z4 @5 e7 A' J7 p9 n* ~

1>从客户机中读取Cookie: $ x0 _: z. b2 X- r$ j Request->CookieFields是个串数组TStrings *,如果不为 6 d: T4 @3 h6 N8 D2 o8 C+ B1 ]空,每一行都将是如下形式:+ C5 E7 v) c8 |: P Cookie变量名=值3 }) x8 @' n% T. n* \ 共有Request->CookieFields->Count个变量,# Z( u4 J$ c! X: [0 j" ?5 v 变量名为Request->CookieFields->Names; (i>=0) + O' n% X# W) ~+ k$ Z0 @Reauest->CookieFields->Values["变量名"]就是对应的值;7 X" C \( c6 F8 [2 A2 ? 请注意: 客户首次访问网页时,客户机中并不存在你将要设的# W4 ~' E3 v0 L7 j# Y Cookie变量,所以第一次Request->CookieFields将是空的;

* B0 d8 h+ W. B/ k2 H3 k

2>将Cookie变量保存客户机中:$ l% \7 E" s7 F1 F' N. j6 f TCookie *pNewCookie = Response->Cookies->Add(); - V& r, {" k# }3 Q pNewCookie->Name="变量名1";$ ~# K+ \ S: f; u j1 v pNewCookie->Value="值1"; 1 M8 `$ Q7 D3 d+ i2 t) ]& I6 k pNewCookie->Expires = Now()+366; // 保存一年" |5 f% j5 O% }. @; \ 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

! L7 Z/ B9 N9 w5 Z8 o! Y0 Y

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交, p; i0 J/ ?1 M; \( f .DLL后,每刷新一次浏览器,将看到计数值将变化一次:

2 l' h: Q5 z. f ~% a. A5 K Q

void __fastcall TWebModule1::WebModule1WebActionItem1Action(7 K+ O: q7 W7 @$ h TObject *Sender, TWebRequest *Request, TWebResponse *Response,$ I2 r' Z( K" w2 N4 r3 o* k bool &Handled)' F. N/ J: k4 l; k2 n, T5 w { % f. U' u ?4 F TStrings *cookies=Request->CookieFields; 7 @3 t0 K# H F. J String oldvalue1=cookies->Values["count1"]; // 取count1旧值- a- Z( q. a0 a3 r3 t2 b" I" H String oldvalue2=cookies->Values["count2"];

6 a/ Q3 V& `/ L) M

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 ; y5 g! m0 m. V' o# n String newvalue2=oldvalue2.ToIntDef(0)+100;

' L; U5 L/ Z& d8 c* z. P

TCookie *pNewCookie1 = Response->Cookies->Add(); % d- T5 X- n8 \& P& C pNewCookie1->Name="count1"; file://更新Cookie$ Y3 Y" ]+ { b( m pNewCookie1->Value=newvalue1; ' x, @8 T- S: \4 z% ]. N1 i pNewCookie1->Expires = Now()+366; // 保存一年

2 i2 y* R4 F4 m1 _8 d

TCookie *pNewCookie2 = Response->Cookies->Add();/ w8 K+ C' u9 K& b: B pNewCookie2->Name="count2"; file://更新Cookie 0 e ]* }$ J% m- s pNewCookie2->Value=newvalue2; + H: s8 o$ V% ^# u, c8 j/ ] pNewCookie2->Expires = Now()+31; // 保存一月

4 q' M# M9 z+ U/ f

// 向客户显示Cookie的值 / P m/ n8 P! Y% } String h0="<html><head></head><body>";6 A% h; v' G' Z) ^+ M4 b/ b String h1="</body></html>";! g a+ N' z0 I6 N# b) }% M2 w String s1="计数值1="+newvalue1+"<br>";2 k4 @; `/ g' a2 G) B String s2="计数值2="+newvalue2+"<br>";

7 Z& d+ i- K4 B4 z: L0 q

Response->Content=h0+s1+" <br>"+ 9 V# N' D( T4 R, W+ s% F s2+" <br>"+ h1; 8 }* J2 {8 e, Y0 ?7 I} # X6 Y+ H) e4 s# L7 F

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-19 02:31 , Processed in 0.460528 second(s), 52 queries .

回顶部