QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

% I( P8 W/ Y1 M. K. k* [4 j$ c5 E

一、 Cookie概述:

$ Y9 _9 ~( |+ c/ x1 [5 F4 E. r: N

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 " W5 [2 L1 r6 R. r8 s Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机& G) b8 Y3 B* Z$ _; o$ T/ v H+ s 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 / a8 f+ w9 d2 v- E" @测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量+ m- T+ d9 H( G1 w( E x4 K4 g8 g 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 / Y3 t; V, h ?9 ?所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 " [+ D1 \# S% k& R3 m" f6 Q页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫# F4 |0 J o2 h0 J5 D9 \7 h 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,+ X: H0 Q: ^# w& R. O% H, @6 y' [ 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

n/ ]5 p# K8 ?

二、JavaScript脚本对Cookie变量的存取: : n# J; e0 E, K3 P% G JavaScript是运行在客户端的脚本程序,用它可将文本输入! J* k! z/ P' c- k9 g 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍' y. K. l4 s: M+ |6 m$ ^0 O8 s 微减轻Web服务器的一点负担:

# h" N2 ~- M8 U) ~" E& C

1>读出Cookie:3 \, u) B) |; B" Q JavaScript中可通过document.cookie访问到所有Cookie:3 {& O& }; Z* Z$ z "变量1=值1;变量2=值2;变量3=值3;"" Y2 ~" s+ [+ A: Z ~+ Y 需经过串分解就可得到每一个变量名及值;1 |2 v! _& U: O6 j. l' B 2>写Cookie: % B/ F/ o: P! E9 d. @2 ~ email="bush@usa.com"; 7 t& o0 i) L3 U, k( q3 ^) v+ X: s firstname="jorge"; 5 x1 c( R% g' J lastname="bush";$ O, G( Y# |$ K2 P% I$ | expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; % R0 u; n. I# J Q. q document.cookie="email="+email+";expires="+expireDate;3 Y8 j( n4 Q8 W. b' b document.cookie="firstname="+firstname+";expires="+expireDate; & ]. e: r' N; F- { document.cookie="lastname="+lastname+";expires="+expireDate; 2 G9 L$ H! ?: M" i 下页一例,将网页的文本输入框域变量NAME自动保存下来:

! C1 X9 p: p: \" `5 L

<script language="JavaScript">$ [5 i O. o% ?4 n% Y" a <!--7 h8 g) V$ s' P# G5 n4 l function getValue(s,n) // 分解Cookie表达式s/ f& S* L' ~9 b, |: B {/ G* S3 ~& F* y$ ^9 G; T* w) h* g var pairs=s.split(";"); // 分解成串数组 * z, S: o! G6 h for (var i=0;i<pairs.length;i++) 7 w! v1 C: B B. ~" H {2 ?, N4 ^ h: Y- D u/ G8 v9 K var pairSplit=pairs.split("=");8 S" f3 F$ ?* ?( d" c if (pairSplit[0]==n) file://查找n9 R1 b0 F u5 W return pairSplit[1]; file://取到n的值" G j3 \: `# m6 U" ~0 w } 1 [( D& c& y: F0 ?: d* F S return "";8 K5 k+ p2 m1 n/ c }: E: j* L/ Q2 E% s1 ~* w- Q function getName() file://取Cookie中的姓名NAME : `# g( S! r, f! X" [. b{8 \: M) L& z5 K% [7 ^/ [/ a var s=document.cookie; // 取所保存的Cookie; E: _% @* s* R( V) ~* @ NAME0=getValue(s,"NAME");% Y: b7 @! u* a2 V form1.NAME.value=NAME0;. Z5 t0 d1 i/ |5 K! t( ~& c! j } 1 j; w4 g7 p' l# yfunction newCookie() file://将Cookie中存姓名 ( |3 `& a0 V9 p$ y+ z9 {: G* W7 a{+ {+ Y* \; V) }6 z2 v1 i6 i4 L4 m var s=form1.NAME.value; / I' T- d2 j+ l: |# t if (s!="" && s!=NAME0) // 非空则保存% V9 w- q( I7 `7 N. b& B {2 t2 x1 a" G+ h P% B1 r6 S s="NAME="+s; 4 m2 V: [5 t* t7 S$ R$ B5 B; H s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; , G6 i9 c( k- v9 v' n document.cookie=s; // 将保存到客户机中 0 p6 b1 }* z$ T0 c( B } 6 A, \* X" u7 c- v2 a& ` }! v# i- e4 v: n$ s# n9 h file://--></script>& P7 R3 F+ N+ i1 e9 A) K ..................

- b$ w9 | K2 w3 |6 I

<body bgcolor="#00FFFF" onload="getName();! ~' O+ Q8 i/ N+ i. U" ]# X! A6 ] form1.TEXT.focus()" onunload="newCookie()">; X: H8 L/ t9 S <!进入本网页时将执行onload中的getName()> ; i6 Z: [( u- o" m4 D" H4 x, N<!退出本网页时将执行onunload中的newCookie()> 7 V& [1 Y5 z/ ~# L& Z# x..................

* {" d! c! T$ S: H9 _

三、BCB与Delphi中用ISAPI对Cookie的存取: # J. _- K* n# K/ k3 W0 l( E( B [注:Delphi用 .代替BCB的->]

: R. x5 Y u5 `& F8 C1 i; P( C

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, : e9 w7 O# L& j它也可以读取与存入Cookie变量:

. X: k7 l* g% l( l) R. R4 v

假设处理用户提交的方法如下: % D0 X4 [; }0 E7 c+ {8 A' v& }void __fastcall TWebModule1::WebModule1Action(TObject *Sender, : K& n' r* V0 L3 c TWebRequest *Request, TWebResponse *Response, bool &Handled)

: j+ V5 G- H i4 K

1>从客户机中读取Cookie: / @& J, P6 z; q7 ^* B Request->CookieFields是个串数组TStrings *,如果不为; J# r# { A( S 空,每一行都将是如下形式: 8 e( S" Y' s0 J; r; V Cookie变量名=值6 V1 `3 y! D! g9 J" z4 d 共有Request->CookieFields->Count个变量, 8 T" k7 g- J, h1 o. K; G变量名为Request->CookieFields->Names; (i>=0)2 _+ g" O7 {+ i& g4 Z- g% P Reauest->CookieFields->Values["变量名"]就是对应的值;7 C: F3 @$ c. a* X2 d 请注意: 客户首次访问网页时,客户机中并不存在你将要设的% G! K% t2 G$ z& O _. @ Cookie变量,所以第一次Request->CookieFields将是空的;

" `$ y K2 ~/ t' V

2>将Cookie变量保存客户机中:& J5 K# }$ ^) y* n8 ~5 }* p$ @% b TCookie *pNewCookie = Response->Cookies->Add();; @. r( e9 x% @, M( U. |: |1 g) L pNewCookie->Name="变量名1"; 3 R3 r8 |# R' Q# ` pNewCookie->Value="值1";# f% ]% R v ]8 E pNewCookie->Expires = Now()+366; // 保存一年+ H5 N! J* n- i6 ^. w 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

' L" v3 x" E& J* H+ ]) B+ z6 T

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 - D# e' ^. ]0 I3 G J.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

; R- V) r, E) p. C4 Z. G k5 L7 }7 R+ _

void __fastcall TWebModule1::WebModule1WebActionItem1Action(" o, \/ ?! w# y TObject *Sender, TWebRequest *Request, TWebResponse *Response,5 z2 i4 o4 B T/ u/ R5 `) ~2 z bool &Handled) 8 x; d# a; [' \& G{ + U2 h5 n# t# {+ o TStrings *cookies=Request->CookieFields; , k. [$ d0 H* R, g- B String oldvalue1=cookies->Values["count1"]; // 取count1旧值 + x% L* r' U" a# h+ p, d String oldvalue2=cookies->Values["count2"];

# Y3 [3 G2 l1 o) h; n

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 4 _$ A& Y+ l& G5 b3 J& F String newvalue2=oldvalue2.ToIntDef(0)+100;

* M6 T4 I& Q" w4 _* D( q1 X

TCookie *pNewCookie1 = Response->Cookies->Add(); " v: N! Q5 X/ m- w9 _+ v& `0 l pNewCookie1->Name="count1"; file://更新Cookie8 Z* P- m' x2 J$ Q pNewCookie1->Value=newvalue1;7 {+ g3 j3 ^- o" N: l pNewCookie1->Expires = Now()+366; // 保存一年

$ @8 ~! J7 n! M6 E3 T2 R/ b0 C

TCookie *pNewCookie2 = Response->Cookies->Add(); 4 T: `" c8 L& D/ a' F pNewCookie2->Name="count2"; file://更新Cookie , P$ R$ z" ]) Y6 m0 J! D pNewCookie2->Value=newvalue2; 5 k; Q7 K S8 G5 Q pNewCookie2->Expires = Now()+31; // 保存一月

% ~: F3 Z; ?$ q# _9 ]+ `) ^

// 向客户显示Cookie的值1 _3 B5 h% `1 r String h0="<html><head></head><body>";- b7 s$ d- ^2 E% D: ]' y String h1="</body></html>";1 y$ r* y2 y1 w String s1="计数值1="+newvalue1+"<br>";* _' }! A$ \: i7 J4 E# R String s2="计数值2="+newvalue2+"<br>";

: ?6 w" v% H; e7 @' L

Response->Content=h0+s1+" <br>"+ % ^" E" W7 z# y5 @+ { s2+" <br>"+ h1;6 G7 c `7 m: _- j$ l# @# a) z } ; S1 w' z. G) T; Z

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:10 , Processed in 0.580049 second(s), 51 queries .

回顶部