QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

7 G( \. K/ S' [4 y: u

一、 Cookie概述:

+ e- }6 F0 F% u4 b5 e; Y, @& C

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。6 b& {+ l+ H. |' Z" V Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 % w% ]( ]8 i! K2 g% a内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可7 m; y- I/ w: I* e7 x 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量2 \& v$ h5 T# T; F# i) k, Z! @ 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次0 p4 `3 y! F; v/ S 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网* \. E# a4 x$ n7 x 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 * o+ |0 G. J# X/ t# M/ H$ t5 X小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, 3 Y: B, T7 Y9 ?; x8 q) ?使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

! N" Z g+ O- A$ l

二、JavaScript脚本对Cookie变量的存取: 9 g8 H! K6 B, t) I% O' A: T JavaScript是运行在客户端的脚本程序,用它可将文本输入 6 `8 ~6 E; c4 X m. Y框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 + F7 @: K" X9 _9 Z7 w微减轻Web服务器的一点负担:

7 C( Z1 E% c$ G- n5 i( Y

1>读出Cookie:2 v! K! h0 ^# t( z! Z- w. H JavaScript中可通过document.cookie访问到所有Cookie: $ G2 @4 F. M# b/ { "变量1=值1;变量2=值2;变量3=值3;" j) G6 f) X3 K 需经过串分解就可得到每一个变量名及值; ) K4 _1 l, m! G 2>写Cookie: % D* t/ Y. K2 } email="bush@usa.com"; ; U% M5 C- c$ s firstname="jorge"; 9 ^/ g( ?* {& i, ^$ i& | lastname="bush"; 7 g: ?- z* C. Z6 U3 c" |: m2 F expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; * i3 \: G# m- M: g/ M% b ^ document.cookie="email="+email+";expires="+expireDate;' t3 h& w6 |7 o3 D/ h! |4 s: u document.cookie="firstname="+firstname+";expires="+expireDate; # o3 A+ K; Q7 F- O8 [. B document.cookie="lastname="+lastname+";expires="+expireDate; ' _4 k. d" u8 N# z 下页一例,将网页的文本输入框域变量NAME自动保存下来:

( R/ |; _: I; c6 x9 r

<script language="JavaScript">. \, v+ ~5 i; i2 V f <!-- / t5 X- ^7 w$ b- G" D1 @+ cfunction getValue(s,n) // 分解Cookie表达式s ! D A3 ^' v$ n0 i& ~{( H. P3 I' g7 s! j t( V var pairs=s.split(";"); // 分解成串数组5 I$ B+ _( a" R. C4 y' H' X for (var i=0;i<pairs.length;i++), N9 o& q; E5 ?$ U8 |. C0 Y: w {3 ^% b: M3 m- q0 p( { var pairSplit=pairs.split("="); 8 v; u# V2 ~) u8 l' i$ f# Y if (pairSplit[0]==n) file://查找n " m: R6 c" L6 }; D j/ f return pairSplit[1]; file://取到n的值 * L: B% y( s s( f7 y } + ^ ?+ ~/ ]8 @1 ?, a7 b5 S7 ?. u6 d return "";1 j: V8 v$ T9 s } & U X8 L/ W. sfunction getName() file://取Cookie中的姓名NAME1 N Z1 m4 A% z, @ { / B# A. \& c$ X7 `* H8 {4 G var s=document.cookie; // 取所保存的Cookie 7 @, \4 ~' h+ B- a* ` NAME0=getValue(s,"NAME"); ) H. q. R! V, b$ V- r- e form1.NAME.value=NAME0; 6 R9 @* x% Y) m; h: l} # V, }% A# G4 a* O8 W; s/ P2 wfunction newCookie() file://将Cookie中存姓名% E+ e5 h6 q! l { 5 j3 }7 {) N q: r1 Q var s=form1.NAME.value; - v! D% z0 a5 J7 N$ Y B if (s!="" && s!=NAME0) // 非空则保存3 q5 c$ c0 e7 k" A" X+ w( ? { * F% [2 Y: b; p- L1 G7 L/ {# R s="NAME="+s; " D2 t& l7 p- J% i s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";' o, I G. _4 c) Z+ t" \8 e document.cookie=s; // 将保存到客户机中. N1 O+ N( y: B1 D } 3 ?$ x3 ^- [( y}& b0 t9 i. p% w: L$ H file://--></script> : d9 D9 \) v1 Q0 @..................

9 Q% I4 K4 k1 X/ C1 {3 Y+ y# Z

<body bgcolor="#00FFFF" onload="getName(); : D+ h! V$ |( t I form1.TEXT.focus()" onunload="newCookie()"> 0 t; [' Y. N6 }, M/ a' h/ Q8 |<!进入本网页时将执行onload中的getName()> # |8 ?3 K$ _# x1 N F7 ]+ F7 Y. T( c<!退出本网页时将执行onunload中的newCookie()> / k1 n! e/ x+ i..................

4 g9 c! M) S# f2 v+ m

三、BCB与Delphi中用ISAPI对Cookie的存取:! L1 b9 \* W) _ [注:Delphi用 .代替BCB的->]

6 z% \/ ` T5 p3 M

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,1 [& K% x, H5 |$ m. E 它也可以读取与存入Cookie变量:

5 F! Z; g3 x J

假设处理用户提交的方法如下: - M0 o* _' q6 u2 [void __fastcall TWebModule1::WebModule1Action(TObject *Sender, - Y a* {$ q; {0 k+ P9 |- X TWebRequest *Request, TWebResponse *Response, bool &Handled)

% E% l- E [4 r% K# R4 v$ E

1>从客户机中读取Cookie: 3 V3 Y- I) a# v$ Q( q Request->CookieFields是个串数组TStrings *,如果不为 2 ~; R8 F3 Z8 ]4 z! i3 |4 g空,每一行都将是如下形式: ( K0 F( z! @. D7 ]' B Cookie变量名=值' p# B2 O4 W% x5 `$ H2 p7 D" O 共有Request->CookieFields->Count个变量,2 G$ n1 j/ t3 F/ s& x: }: H# } 变量名为Request->CookieFields->Names; (i>=0): h, t' o: p4 J7 }% D Reauest->CookieFields->Values["变量名"]就是对应的值; " s8 \! B% r& Z% P2 d请注意: 客户首次访问网页时,客户机中并不存在你将要设的 % I$ I3 ]$ v. a8 x z$ ]" WCookie变量,所以第一次Request->CookieFields将是空的;

+ L4 N4 |% U3 ]) T7 u% Y4 t

2>将Cookie变量保存客户机中: , b/ J0 i+ q# \3 R/ w' [' P6 k TCookie *pNewCookie = Response->Cookies->Add();1 E& ?: m% O; f# P. a7 B pNewCookie->Name="变量名1";$ V$ z; u$ z4 a1 \ pNewCookie->Value="值1"; 2 L0 c! a" n# C0 j pNewCookie->Expires = Now()+366; // 保存一年 $ p4 E& P+ u2 J" F3 i. l就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

5 _# \8 B$ C8 j/ `3 N; ?* i

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 ; k5 Z2 ?4 R Q. C- N.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

6 M) p& @; p. o5 V; {# Z9 ?

void __fastcall TWebModule1::WebModule1WebActionItem1Action(; F" g8 r3 n$ @4 a2 g, f' s TObject *Sender, TWebRequest *Request, TWebResponse *Response,7 Z& n; t/ l. I9 C3 Q1 V* A bool &Handled)& |% u6 k( q, j' G" @& d' F* Z {- o9 Q! m+ ^/ l+ Y# `" J TStrings *cookies=Request->CookieFields;8 P, O6 F' }' i& l String oldvalue1=cookies->Values["count1"]; // 取count1旧值7 V t1 g+ x/ u# \+ P String oldvalue2=cookies->Values["count2"];

& i6 f' `) `) K/ T9 z. z% d

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 + p# f6 m8 ~- \% x+ x String newvalue2=oldvalue2.ToIntDef(0)+100;

! @. Y' t, R' v2 r! |

TCookie *pNewCookie1 = Response->Cookies->Add(); 7 s( q0 _: q9 d( ]" u0 T pNewCookie1->Name="count1"; file://更新Cookie# u5 M4 D7 x5 D! `- }& T0 o' q pNewCookie1->Value=newvalue1; , \2 o, y* {* q( } Q [ pNewCookie1->Expires = Now()+366; // 保存一年

0 d" _4 O9 r2 H, z" i0 m

TCookie *pNewCookie2 = Response->Cookies->Add(); / \: _) Z7 ^4 Y pNewCookie2->Name="count2"; file://更新Cookie * [; W& Q( W) ?7 @' ~ pNewCookie2->Value=newvalue2; T' O& F" \8 S5 H pNewCookie2->Expires = Now()+31; // 保存一月

. S' Y# S6 X/ Q% E

// 向客户显示Cookie的值 3 |- N9 Y, A( D* e# j$ r String h0="<html><head></head><body>"; / K. s! t! ^+ p2 H2 W4 b* t* y String h1="</body></html>";+ D6 _9 v+ y g0 q String s1="计数值1="+newvalue1+"<br>";& o7 u Q& r, B" Z! i String s2="计数值2="+newvalue2+"<br>";

" N" Q* \( G: V! U; @! E( t

Response->Content=h0+s1+" <br>"+ 6 A& _' b9 e [& a* | s2+" <br>"+ h1;2 H- m, D2 C6 Q% ?, m/ O } 2 O; p" E9 m% y9 {: B% V# r

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-8-12 02:09 , Processed in 0.432184 second(s), 51 queries .

回顶部