QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

5 G/ ^/ A$ \5 m9 x4 W

一、 Cookie概述:

6 Y6 d/ @/ t5 S

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 / i, g) Z; q- B* Y$ g- P Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机5 @2 v3 ?6 f! W& z/ | 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 7 e# u" |6 @% v: _* I- Q测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 + P2 u+ [) v4 N* ?& b的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次- F9 w' T& G4 l* b) b& v6 L 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网6 @, I9 B" y3 ? 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 ! w$ e2 ^$ m- B3 {) w. d小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, 7 h1 I- I2 S7 e6 g. g8 ?使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

& k1 I$ Z6 Z% F; E

二、JavaScript脚本对Cookie变量的存取: 8 l @% {' H8 Y* X6 ^) v. j- h JavaScript是运行在客户端的脚本程序,用它可将文本输入1 z0 s/ Q) p9 a- g6 w" d& W- y 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍5 ^( `; c- X) a0 y! ^ 微减轻Web服务器的一点负担:

2 ?$ k9 F- o3 @( ?

1>读出Cookie: # y; ]3 b k, P; u! T JavaScript中可通过document.cookie访问到所有Cookie:& r1 \* G* P; m3 p: I( M5 r "变量1=值1;变量2=值2;变量3=值3;"# i) G- U; _2 K D" L 需经过串分解就可得到每一个变量名及值;# o' |& r! ~$ p 2>写Cookie: ! b- O( E- i7 w! l5 f# ^5 f email="bush@usa.com";( V6 y, I- {' U& b! | firstname="jorge";; @" b# E* c+ g lastname="bush"; % P$ P% T$ O3 o( A, N& p expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; 3 X' x% i) z' B( }7 Q8 g F document.cookie="email="+email+";expires="+expireDate;# _" f# w* E* x document.cookie="firstname="+firstname+";expires="+expireDate;9 z* O8 b6 M" m; ~ document.cookie="lastname="+lastname+";expires="+expireDate; * J O$ }! r+ Z- e3 L& m( @ 下页一例,将网页的文本输入框域变量NAME自动保存下来:

- C7 r7 ^6 l5 k4 z

<script language="JavaScript"> 7 d) ~3 Q. q* w# p8 @<!--7 a: r3 t s3 ?2 O8 E6 f function getValue(s,n) // 分解Cookie表达式s2 _4 A+ y5 I3 C* D `! \ { & j- _( V! i7 b& f7 y6 B var pairs=s.split(";"); // 分解成串数组 & p$ D/ q) h* ^& x8 G7 ^; G for (var i=0;i<pairs.length;i++) 4 l' }5 k5 U5 ]* v6 H {# F3 `& v- L$ [$ i9 A4 M' h var pairSplit=pairs.split("=");4 Q* k3 p4 f6 U4 [/ T if (pairSplit[0]==n) file://查找n 1 D8 p6 Z6 V) L0 s! m( E& X return pairSplit[1]; file://取到n的值; T& x4 [( v U2 v+ V3 c4 L } ; W5 i6 R. ~0 i. n+ ~% j* N return ""; }2 M+ A5 N! Q3 [ o} 9 p: i; Z& g5 m) q! {4 R( efunction getName() file://取Cookie中的姓名NAME + [3 l0 n9 ]7 k{ 3 t2 w9 P$ V& @, f& P var s=document.cookie; // 取所保存的Cookie 0 W& k. U/ k3 z NAME0=getValue(s,"NAME");0 C5 _0 v; N2 y" C' w& e form1.NAME.value=NAME0; / O% T7 |6 w$ n3 @/ B}, }/ O0 d' b: T* t) r8 N9 P: _ function newCookie() file://将Cookie中存姓名/ s6 c5 Y' n$ s2 w8 g" F { $ b! U& k1 i, @+ l9 e! C3 S var s=form1.NAME.value;/ p$ m" z5 _. _# U0 n/ O( J if (s!="" && s!=NAME0) // 非空则保存, J! w5 {9 `3 K7 k# u { 5 T1 U% G! P' H/ }# | s="NAME="+s;! I0 Q& H! C* c3 @+ M s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; 7 G, R9 ]& R8 e9 a9 B9 L document.cookie=s; // 将保存到客户机中 8 J+ s: h1 n. L+ `8 N: F) N } . v0 K% I& g8 p! j* g" q5 Q1 f }9 O2 s0 y8 K; x" e7 K) Y$ Z" A5 z7 \ file://--></script>6 e ~* W# i5 Y. s' {8 ? ..................

( H) v0 C) z: \& z5 c& x; g$ ^# \

<body bgcolor="#00FFFF" onload="getName(); $ H5 m' ?' L& h! H0 K form1.TEXT.focus()" onunload="newCookie()">* ]$ G* [' y# j9 V7 ] u <!进入本网页时将执行onload中的getName()> % s; j6 a$ s, y3 U. A: A5 g<!退出本网页时将执行onunload中的newCookie()> 9 P" a! l$ Y" U, h+ S9 X..................

7 e! x0 [) n3 a, }+ w

三、BCB与Delphi中用ISAPI对Cookie的存取:/ C/ K" l$ o% o [注:Delphi用 .代替BCB的->]

$ i. L5 H! S. N) S

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, % t3 f3 L& F; ]. G5 l( M6 M它也可以读取与存入Cookie变量:

! @* j6 p2 V' s, g, V

假设处理用户提交的方法如下: 9 y3 G s5 W- e, G8 T+ evoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, ) @% o- u3 W2 ^( S) eTWebRequest *Request, TWebResponse *Response, bool &Handled)

/ n' f& Z. l" w" T

1>从客户机中读取Cookie: % U& ~. b: M( F1 m( v, v Request->CookieFields是个串数组TStrings *,如果不为 ; v. Y, }7 J1 J& O, D z空,每一行都将是如下形式: * p0 y# E8 T# I# u( c Z- j! I, R6 i Cookie变量名=值 ; ^8 O: \& G5 X& r: k, p B8 [共有Request->CookieFields->Count个变量, 7 o. p/ o* k; O4 t9 X; a0 u变量名为Request->CookieFields->Names; (i>=0)1 ~& i3 m( F! Z( |9 B" S Reauest->CookieFields->Values["变量名"]就是对应的值;9 R" Q% S) L3 E. I, V 请注意: 客户首次访问网页时,客户机中并不存在你将要设的 F$ s5 T2 n; C, kCookie变量,所以第一次Request->CookieFields将是空的;

6 P5 \" _$ K U9 V* f% l9 E

2>将Cookie变量保存客户机中:# j+ @; U8 q: e! l3 s3 r TCookie *pNewCookie = Response->Cookies->Add();6 l3 s$ {+ [+ n* h% A# S, ^, K pNewCookie->Name="变量名1";" ?& L4 k# }" Q7 O# {' G pNewCookie->Value="值1";/ x. f+ Q- m; l5 C2 s" m! ^ {3 J pNewCookie->Expires = Now()+366; // 保存一年/ d: t' L4 a& J8 B: s7 h 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

' u6 w6 ^. m+ v9 z/ {$ h

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 ! ~! G: F. _$ c* j" j.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

! l0 Z( O7 q0 Y$ w

void __fastcall TWebModule1::WebModule1WebActionItem1Action(# O) b+ j C# w. v! J TObject *Sender, TWebRequest *Request, TWebResponse *Response, M. d f, e6 e7 q bool &Handled) 2 A9 m; X: s; Y+ b{$ w( F" G- x# X# R TStrings *cookies=Request->CookieFields;& i) P8 I$ ]% q# b# _7 d String oldvalue1=cookies->Values["count1"]; // 取count1旧值6 R$ w+ G; Z" u4 Y5 r' `; V String oldvalue2=cookies->Values["count2"];

" ]8 R( ?4 T: b% g9 `

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值6 } D1 b2 S7 _1 l String newvalue2=oldvalue2.ToIntDef(0)+100;

3 \* r3 }/ G! t9 j

TCookie *pNewCookie1 = Response->Cookies->Add(); , L8 L5 w3 _! g( C: x pNewCookie1->Name="count1"; file://更新Cookie2 s; x9 `7 ` E pNewCookie1->Value=newvalue1;/ X2 J6 d% X% z- X pNewCookie1->Expires = Now()+366; // 保存一年

3 l, `' ?0 a9 T7 s

TCookie *pNewCookie2 = Response->Cookies->Add(); / Q0 i5 y; _$ b! h9 |4 S5 s pNewCookie2->Name="count2"; file://更新Cookie % B& ]" N+ z8 Z, c$ Y pNewCookie2->Value=newvalue2;) G/ E+ X1 d% I; z7 a2 }; K pNewCookie2->Expires = Now()+31; // 保存一月

; {& a! K- C, R

// 向客户显示Cookie的值: f- y& E! s9 x8 B( I5 i- V String h0="<html><head></head><body>";; K) q: H2 h" {7 T4 Z String h1="</body></html>";; {' A" h# |1 W* x y String s1="计数值1="+newvalue1+"<br>"; : ~6 L% \* n1 \5 J e( c String s2="计数值2="+newvalue2+"<br>";

- N" t3 ]% V5 P# O3 T/ w+ A

Response->Content=h0+s1+" <br>"+ 7 t3 |: ^5 e" u/ V4 d% E s2+" <br>"+ h1; + W; w! k+ W) X; O' Y) i1 q} 3 M* f7 j7 w; s0 l4 }

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-6-11 08:51 , Processed in 0.567724 second(s), 52 queries .

回顶部