QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

7 a4 f+ Z5 U2 P9 ?6 |

一、 Cookie概述:

4 u/ m& h! y. H, N& b8 G

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。! H1 ?& b4 I' k: O4 Y: V7 [* U Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 6 {/ w& ~2 i7 D. ^) p0 ~6 S7 h6 ]内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可) b" `: r& u5 Y8 W/ B% [7 R+ Y 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 , U% M+ }; ^9 D" @! F: |- M的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次* n+ t& A; |+ D5 B# K i7 B 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 ! I6 j/ a" K$ }/ p' A8 @. k页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 2 b, g9 y1 b) E ~1 c4 p& _4 P小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,& f; L# ~7 M. o" y1 L- [9 Q 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

4 A& \$ {. R# m( O9 g

二、JavaScript脚本对Cookie变量的存取: % v8 x, G: f8 v: M. ^$ b8 ] JavaScript是运行在客户端的脚本程序,用它可将文本输入 : q, U" X7 z' @( P( |# U框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 : L) z. h* @1 T7 {* q$ j- ^3 ~微减轻Web服务器的一点负担:

4 x; q" e& f* {) o

1>读出Cookie: 4 Q' E8 n/ E/ _" ^) o' |4 s JavaScript中可通过document.cookie访问到所有Cookie: & |" f+ [- K. w5 I, u6 X4 J% u- S "变量1=值1;变量2=值2;变量3=值3;"8 h) t2 v! T1 Z) k2 M! o0 y8 z 需经过串分解就可得到每一个变量名及值;; c- [+ s5 [" e3 X8 k 2>写Cookie: ( }& u4 h$ S6 L$ u- w. R% o email="bush@usa.com"; 0 g. R( q$ d) Z s- w, r$ ]% m firstname="jorge"; 8 H( r: ~! E ~9 B9 j% e lastname="bush"; 6 x) v4 x0 {( z5 e H+ L expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; . J, D% K3 E( O2 z: ~! @ B: G0 x/ R document.cookie="email="+email+";expires="+expireDate; ; S" S7 H t9 e6 @% V9 w document.cookie="firstname="+firstname+";expires="+expireDate; 9 v$ c5 i# c0 {3 u5 A6 U/ X8 u- H document.cookie="lastname="+lastname+";expires="+expireDate; . {0 Q% ^- z, E2 s' X' W 下页一例,将网页的文本输入框域变量NAME自动保存下来:

& J9 N8 h! U. B# w0 _8 h

<script language="JavaScript">; [4 _6 @$ Z$ K$ l <!-- / D, @* j: @: dfunction getValue(s,n) // 分解Cookie表达式s / D7 N( y! u( O1 \% D: R{; H* r3 T" ?- G; F! t8 F9 c) K2 h var pairs=s.split(";"); // 分解成串数组' H) ]0 s! T; b$ a( l for (var i=0;i<pairs.length;i++). s8 h! H8 }' g {1 R" [# r$ T8 w! B( A! K2 g4 A var pairSplit=pairs.split("=");. T# A; D0 V' U y if (pairSplit[0]==n) file://查找n 9 m: P# c. c- [ return pairSplit[1]; file://取到n的值6 z3 R/ `: Q( m' Y: b } ' G/ W' d) E9 V& O return "";( V1 x( u1 c! w, _: i }. u. w/ s# [ v! j3 Q! B function getName() file://取Cookie中的姓名NAME ( ]6 w9 i3 k% o J3 z( r* ]{ , |& |1 k& i6 u9 H+ f. M1 b/ s/ I var s=document.cookie; // 取所保存的Cookie ( |! i" C% \1 ]% E2 d9 ]( ^, x NAME0=getValue(s,"NAME"); ' P ?, V- J) m: g5 C1 X, I: j form1.NAME.value=NAME0;2 y$ M1 t' R c+ | }) e0 u# M0 H) z9 E function newCookie() file://将Cookie中存姓名 * }; j5 e. e, H C! T" F2 E{ , T( ^% X% _; ^* J! X: J var s=form1.NAME.value; 2 _! Y' \" w! z* D- X3 i if (s!="" && s!=NAME0) // 非空则保存 + h( `7 w% U% Y6 h \ { 7 t% I% W5 F! c0 e4 ~) Y3 i s="NAME="+s; 6 U$ `: M" \# d/ }; [ s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";) ^, M2 q, h1 Q- W5 U( r- s9 l document.cookie=s; // 将保存到客户机中7 N! Y; _/ u0 o0 X; v } 3 D( [! H% S- D" j; c ^}# m6 j1 m$ k% y! D' v6 ?6 P* _; b file://--></script> , {$ |7 e* ?) O w..................

! @+ x( f: x- M# r8 _0 a

<body bgcolor="#00FFFF" onload="getName(); $ N3 E! l, ]" u* j form1.TEXT.focus()" onunload="newCookie()">6 `" ]- o" Q/ n% S# Y. G& u <!进入本网页时将执行onload中的getName()> + n% s6 F* M5 a9 l1 z6 L4 ]<!退出本网页时将执行onunload中的newCookie()> 4 |( h2 ~/ T; S3 x7 `" a: J..................

, `( K9 B |7 L2 f+ B- Q

三、BCB与Delphi中用ISAPI对Cookie的存取: 3 m9 L4 K; @+ ~$ i* X5 s! p; P [注:Delphi用 .代替BCB的->]

7 }; D% Y) |% l

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, ( k) |; W# f, s% ?5 U$ e它也可以读取与存入Cookie变量:

- x7 q. v; |+ D% B; c; ^

假设处理用户提交的方法如下: ( j, t. `: c+ ?. L/ A0 t void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 1 C8 t i! w( i, x8 a9 F TWebRequest *Request, TWebResponse *Response, bool &Handled)

1 Z0 M) U h9 f/ g. h( L" I

1>从客户机中读取Cookie: , {0 i# d, [5 e0 G! O Request->CookieFields是个串数组TStrings *,如果不为9 g, S, P4 b, m 空,每一行都将是如下形式: 9 N9 a2 F$ ~. G* l1 R' x Cookie变量名=值 9 A9 c$ f1 }& q; i0 U& d% `: f5 `! }6 E共有Request->CookieFields->Count个变量, & H8 h) Y" g- A2 x变量名为Request->CookieFields->Names; (i>=0) 3 ~. R4 n M& ^- {& T3 Z* L# L; s0 nReauest->CookieFields->Values["变量名"]就是对应的值; * O1 j# ^" P# p* c请注意: 客户首次访问网页时,客户机中并不存在你将要设的 3 a, T4 m. ? }: x r+ mCookie变量,所以第一次Request->CookieFields将是空的;

8 A! m2 S4 ^( ?" P; ~

2>将Cookie变量保存客户机中: 1 g; P# |/ ]4 Q TCookie *pNewCookie = Response->Cookies->Add(); }! o7 m" }4 B7 a& w. D: { pNewCookie->Name="变量名1"; + m# I* |4 M& x5 I3 E pNewCookie->Value="值1";, z7 L2 L5 N+ q! Z6 I# h pNewCookie->Expires = Now()+366; // 保存一年 2 @1 Y) d' X- w& T [就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

( r6 f8 F9 G' `+ R# C7 ]6 |

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 / B& A5 b3 I5 _ X.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

3 z! X: p& k. x7 y

void __fastcall TWebModule1::WebModule1WebActionItem1Action( 5 q: f9 U# X+ S( e TObject *Sender, TWebRequest *Request, TWebResponse *Response,- b* L8 a3 F) p% I% k6 Y) _ bool &Handled)- y% n1 \$ s. ^5 X+ u8 `' v { * _3 F6 ~+ y0 c TStrings *cookies=Request->CookieFields;" X. a* V5 ^# y; ?2 @ String oldvalue1=cookies->Values["count1"]; // 取count1旧值 : M! x; @5 P. B; c& A% O String oldvalue2=cookies->Values["count2"];

: T, U5 u9 l/ o/ K

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 & |! v; v/ ?( @2 F5 y5 F* p String newvalue2=oldvalue2.ToIntDef(0)+100;

5 g2 Z8 v/ S# r+ Z: i

TCookie *pNewCookie1 = Response->Cookies->Add();3 _9 P" D4 G1 f pNewCookie1->Name="count1"; file://更新Cookie 3 z9 W6 t0 U6 l1 I pNewCookie1->Value=newvalue1; % u% P# B7 c% B% ` pNewCookie1->Expires = Now()+366; // 保存一年

8 l/ ?# O* f# g

TCookie *pNewCookie2 = Response->Cookies->Add();' V$ i$ G* l8 R. p3 ]% C pNewCookie2->Name="count2"; file://更新Cookie 5 _$ c, A' V; X1 c @+ ]1 i+ h1 x( O pNewCookie2->Value=newvalue2; 6 ~5 }3 S8 y i; Y9 u pNewCookie2->Expires = Now()+31; // 保存一月

& b& W# I) [ ]! M/ I1 v

// 向客户显示Cookie的值 ; m) K+ a, C# r String h0="<html><head></head><body>";: s4 J6 G( |! H) [$ ^- o% S String h1="</body></html>";2 H; o* A6 W6 T: \0 t/ K- c e String s1="计数值1="+newvalue1+"<br>";- A+ V7 I* ?( k0 ?5 p, B String s2="计数值2="+newvalue2+"<br>";

$ n; Q* _/ E. T3 s" |

Response->Content=h0+s1+" <br>"+ 8 |( T4 q) }9 R& e( T s2+" <br>"+ h1;/ {5 V% E0 ^7 M# d! L } + j- [" ^8 f& k

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 01:11 , Processed in 0.436796 second(s), 53 queries .

回顶部