QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

% `, L/ t" T7 G# A

一、 Cookie概述:

) g9 @: k X# z8 x3 B/ a3 r

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 4 q7 C y5 \$ G6 ^5 f0 r# s Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机5 W$ l2 F1 k3 G5 i7 T1 @ 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可' D7 ~0 B8 P9 N% m2 e5 {$ \ 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 * W9 l& Q. {3 I& d4 b的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次/ I. `& v' B8 } 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网# p J6 g6 {' h0 `8 D0 G* W- ^% I 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 ( a) s X% }5 j小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, ! a) o6 X& R, A Y/ J使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

1 B% x1 H) v C8 S1 {

二、JavaScript脚本对Cookie变量的存取:, \" j# Y2 x8 o" E4 ^$ W& d6 c! m1 N' X JavaScript是运行在客户端的脚本程序,用它可将文本输入 u) }$ v3 w0 y8 S框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 7 b G. ~5 v9 g H/ B* i5 P微减轻Web服务器的一点负担:

" I' t( F: c1 X$ O

1>读出Cookie: ! P+ o- M# u3 G6 {. w1 ~7 B$ Y JavaScript中可通过document.cookie访问到所有Cookie:5 u4 e) S R) `$ w; @) A "变量1=值1;变量2=值2;变量3=值3;". h; Z* [) p) |5 x, ^4 m) {# i0 F 需经过串分解就可得到每一个变量名及值;+ J+ n' ?; l+ J$ d4 K) r, s$ a 2>写Cookie: / q4 r% Z @. u3 E) Y3 I i email="bush@usa.com";0 V5 r. i9 t( ` c+ _. v$ d) W firstname="jorge";4 v# x: O* @3 V6 D- A lastname="bush";/ t" P2 ~$ P- p expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; # c% O' j$ Z; [ a, k* g document.cookie="email="+email+";expires="+expireDate; / m v/ C7 K3 s/ K4 C0 k6 a d document.cookie="firstname="+firstname+";expires="+expireDate; ( i* d# k6 o1 J' S# p/ i- V document.cookie="lastname="+lastname+";expires="+expireDate; & [6 ~" t7 D% Z; d: G' S F4 w2 U 下页一例,将网页的文本输入框域变量NAME自动保存下来:

8 p/ B+ ~: @8 M& N" I( I! M

<script language="JavaScript"> & @1 G/ H3 a: S" |# w' ]8 b<!--1 f, @' _ b# R; T4 Z function getValue(s,n) // 分解Cookie表达式s- p; {3 g' t/ h5 B: o/ M1 j {5 E( @" s2 t/ w" }3 h var pairs=s.split(";"); // 分解成串数组. a, J6 b. C0 U4 R for (var i=0;i<pairs.length;i++)( f. [% w6 k9 `; P9 C { # E( _5 X$ m( k8 i var pairSplit=pairs.split("=");4 a M0 v) C) M: k# y4 j: ]% L5 x if (pairSplit[0]==n) file://查找n . O. r0 s% B ] Y return pairSplit[1]; file://取到n的值5 C0 D6 ]8 i( F6 c) \) P5 ? } + B: r; m: L- `3 h return ""; * O* E' j/ T$ f} $ S v1 I% ~4 \( F! Ufunction getName() file://取Cookie中的姓名NAME, A; D8 m" \. P { # d+ _" }6 v* Q( k/ o var s=document.cookie; // 取所保存的Cookie 0 q+ V0 r$ Z1 j8 Z" x+ N NAME0=getValue(s,"NAME");! P0 n$ ]: ?2 X form1.NAME.value=NAME0;: e" O3 i0 v( p } $ u [) |( C7 n0 g3 w, M! ]function newCookie() file://将Cookie中存姓名2 B5 N$ \8 j y4 J {0 O/ n1 J( ?0 `% L/ E var s=form1.NAME.value;3 M; M6 v8 ^4 B9 ?9 S0 _ if (s!="" && s!=NAME0) // 非空则保存 5 m; V4 u9 g3 `; k* K2 k" h3 c& G j { ! a0 Q _5 G" [8 p/ T5 j6 G# B s="NAME="+s; : p* w, b& y8 a! h7 K s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";) [( ^/ m& p( n$ p. [( B document.cookie=s; // 将保存到客户机中. ^9 v) \/ M, v" O } 1 f4 ]: |1 u! x- [& | }. h! w) S' p, Y* B v file://--></script> 0 v d+ W% S) X. K( p..................

4 T% T) A% K/ t) c: k0 n* E0 l8 i

<body bgcolor="#00FFFF" onload="getName();$ h% h; ~( p* p form1.TEXT.focus()" onunload="newCookie()"> 7 [9 R$ @: t+ P<!进入本网页时将执行onload中的getName()> " w/ p- t' X# ]" J) M, z<!退出本网页时将执行onunload中的newCookie()>6 \& ]; _: h& W$ }8 d5 ] ..................

3 r a) M# v: v

三、BCB与Delphi中用ISAPI对Cookie的存取:& S- p* o1 H( b [注:Delphi用 .代替BCB的->]

( B: ^; ^2 s! M! l1 h

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, 5 x: }) Q7 B- _9 E# ]! t9 x. v0 Z8 L它也可以读取与存入Cookie变量:

2 G* d0 r6 t* ~0 `9 W

假设处理用户提交的方法如下: ' u% O- B$ Q7 {4 ~+ `; ] X5 u void __fastcall TWebModule1::WebModule1Action(TObject *Sender, ! S1 F- E9 a M- l% ?' B TWebRequest *Request, TWebResponse *Response, bool &Handled)

! o6 q/ Q' C, t1 D2 J4 m4 K

1>从客户机中读取Cookie: - V# \2 S& n# R Request->CookieFields是个串数组TStrings *,如果不为 & V4 q [2 O# s! P) i空,每一行都将是如下形式:; t/ X* q, [8 O' }* h Cookie变量名=值 3 z2 i8 S1 {' p% O8 t' n q共有Request->CookieFields->Count个变量, ' D. n* @3 Z2 L. W% m# ~$ T$ o变量名为Request->CookieFields->Names; (i>=0) 8 M2 Y4 |5 K" J( \ T( n' i xReauest->CookieFields->Values["变量名"]就是对应的值; 6 \" V, P5 |% S6 p- H* z( w6 d请注意: 客户首次访问网页时,客户机中并不存在你将要设的 |+ q. c2 V0 U# yCookie变量,所以第一次Request->CookieFields将是空的;

# g" ?1 d6 P2 ]

2>将Cookie变量保存客户机中:, {& f$ e, S* K6 N* d TCookie *pNewCookie = Response->Cookies->Add(); & a" T% B# m4 F2 W1 u0 m pNewCookie->Name="变量名1";0 @, }* v ?% g; R0 D pNewCookie->Value="值1"; ; k6 {* j3 u6 `' A6 m pNewCookie->Expires = Now()+366; // 保存一年 ) n% S- c1 P% d: f8 J ]/ {2 d就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

* \. P" K J: l% o" D, m% {' Y

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 3 i9 Y. v) f7 O, w7 }4 r% O.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

) w9 W; X/ M) r/ x

void __fastcall TWebModule1::WebModule1WebActionItem1Action(# h1 |/ f7 F7 T8 o" Y( G TObject *Sender, TWebRequest *Request, TWebResponse *Response,7 S$ @: H$ A X1 s" n0 R6 C bool &Handled)$ N. [* f: U0 ]1 R { % `) U) H, b# b" ? H% S TStrings *cookies=Request->CookieFields; , i0 J5 I1 {) a# A! L) t! ^/ {. u String oldvalue1=cookies->Values["count1"]; // 取count1旧值 8 h$ }. U. j- r* M( s String oldvalue2=cookies->Values["count2"];

. h h% d3 E3 f! W' M3 o

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 ' C8 [0 o* R: W) o+ Y! B String newvalue2=oldvalue2.ToIntDef(0)+100;

# V4 o* A8 `8 U/ l: T

TCookie *pNewCookie1 = Response->Cookies->Add();7 ?1 B* ~4 h# p; O) C! h pNewCookie1->Name="count1"; file://更新Cookie4 \$ V% S6 H6 O, l! E/ l pNewCookie1->Value=newvalue1;% O* |; K8 h4 ?5 c* s pNewCookie1->Expires = Now()+366; // 保存一年

" X, N: ]. O8 H. h+ e& U

TCookie *pNewCookie2 = Response->Cookies->Add(); % I( ]6 ` X% _5 s7 d9 [* P pNewCookie2->Name="count2"; file://更新Cookie $ H- g3 b2 B0 f: A! _" l pNewCookie2->Value=newvalue2; 9 M( F, i2 Q3 j% _5 L1 W pNewCookie2->Expires = Now()+31; // 保存一月

6 K* `* a7 D* V( f& s7 x

// 向客户显示Cookie的值3 b3 _2 i% z! A, R; K String h0="<html><head></head><body>";' v* D3 U- ]. y3 f String h1="</body></html>";2 b% X% u% y5 P6 x/ d String s1="计数值1="+newvalue1+"<br>"; 2 j6 X9 d- @; m String s2="计数值2="+newvalue2+"<br>";

8 N. L; X) N* S0 V0 Y: Y# R( r

Response->Content=h0+s1+" <br>"+ 1 l N+ m3 s" h: i" k) h+ s' ` s2+" <br>"+ h1;8 o7 y( f& u" o) r8 e6 {4 Q1 q: u } * ?9 f9 G' x: `! O4 }3 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-4-19 00:05 , Processed in 0.257397 second(s), 52 queries .

回顶部