QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

1 G$ Q: ]: F4 e( M7 R$ s

一、 Cookie概述:

8 H3 ~0 i6 i' V

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。8 p/ M! I0 t) Z, ^" x( @7 ~! e Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机' `$ `* J2 J1 @( W! l n 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可6 ~ A5 @! Q' B8 X9 A& K; z 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量% n1 W% `; \4 L9 ]: Z4 { 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次9 W) h" }7 E0 y0 R& @9 B" h 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 , a) J3 u6 [- Y. q2 \页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 # u( j& q: D$ _* f2 \' Q2 u' K小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,; L/ ?& v, j8 e9 N' j 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

. i1 e; L! ~. n6 S; z

二、JavaScript脚本对Cookie变量的存取:. s6 q6 } \4 B# _) ~ JavaScript是运行在客户端的脚本程序,用它可将文本输入 6 {: w0 s3 h& N( ^框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍9 H9 G. R; i( x) d 微减轻Web服务器的一点负担:

4 {, s7 C/ L; s% z& {% E; F* B

1>读出Cookie: Q- l i0 n4 H; [& Q JavaScript中可通过document.cookie访问到所有Cookie: 8 l" _$ c- h3 C. M5 y- y/ L "变量1=值1;变量2=值2;变量3=值3;" & ` X9 p+ x: L2 v @3 N5 l 需经过串分解就可得到每一个变量名及值;" O6 n. a% n- Y 2>写Cookie: $ ~( {' y' k+ S. S email="bush@usa.com"; 8 D0 \& K# ?& u \, @ firstname="jorge";( N# s# B8 |/ g' r2 ?# E7 Z lastname="bush";+ z& d3 E( y8 U" s' P* e expireDate="Thursday,01-Jan-2099 12:00:00 GMT";7 Y% J9 ^; B' t& W document.cookie="email="+email+";expires="+expireDate; . p5 K# [- a9 o! C document.cookie="firstname="+firstname+";expires="+expireDate; 5 m/ I$ M* u d/ T" {* C: p7 x document.cookie="lastname="+lastname+";expires="+expireDate; . [( V; ~% |1 ^# E 下页一例,将网页的文本输入框域变量NAME自动保存下来:

" ?) Q1 C& V; l3 a9 G+ U' V

<script language="JavaScript"> 4 Z5 r. x3 }% r1 s: {$ q<!--# Q% x- x' m) c) m8 Q- W function getValue(s,n) // 分解Cookie表达式s, K* J9 _6 Q$ k. i0 d { $ e# W0 w1 j) r6 C' r var pairs=s.split(";"); // 分解成串数组 * g [; _! A# G" T3 o; q for (var i=0;i<pairs.length;i++) b5 ?6 T& t u7 q3 E9 u/ q { 9 d; c8 P( a2 }7 J var pairSplit=pairs.split("=");* l! a: ]5 n; \7 Q" Z if (pairSplit[0]==n) file://查找n ' m( O0 ^" F" ` return pairSplit[1]; file://取到n的值 ) Y6 c3 {, \' h, ~$ d' P } - Q* {+ e8 @% z. f; ] return ""; / `3 j' z2 }5 I( D! O4 M! ~} 6 D% t( X+ S* z6 t( Dfunction getName() file://取Cookie中的姓名NAME , |4 u& C+ N2 H9 \+ B{, a+ }* x( c3 `) h var s=document.cookie; // 取所保存的Cookie2 r( d( w4 A" d9 ` NAME0=getValue(s,"NAME"); + H/ ^) @' t% u& |! q& Q% z form1.NAME.value=NAME0;7 F, P3 i, a8 v5 e- {2 \" \5 q2 ~ } : \; W7 g' B, y, P+ vfunction newCookie() file://将Cookie中存姓名( F- V3 S! u; J- a { 9 u+ T' }, C( t5 ^2 Q$ ~ var s=form1.NAME.value;' w+ ^& q+ `8 i1 i% ^. M; R if (s!="" && s!=NAME0) // 非空则保存 0 r a; Z) ]3 u& K. W {: f8 {/ J5 J1 C! ~ s="NAME="+s; ; Z# E4 F B; R0 I! P1 @: v s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";: C! c6 F, ^# T# a document.cookie=s; // 将保存到客户机中 . R" r' l9 R+ k; A/ ?! A' R, ^ } 5 j7 D+ o, A; q8 c \}7 S- }: R9 g5 H+ P' x file://--></script> 8 `1 R t" |7 f& _( j..................

; n( s( U5 I& b

<body bgcolor="#00FFFF" onload="getName();0 x! [ t. I1 R" P5 c form1.TEXT.focus()" onunload="newCookie()">( v$ `4 _7 {5 G6 P: v; {+ X <!进入本网页时将执行onload中的getName()> 4 c+ K! X) }1 K$ Z/ x2 S' q1 t<!退出本网页时将执行onunload中的newCookie()>2 o0 ]$ `' K5 T$ P' T5 Q) ` ..................

8 r' k) b4 [ W& ^5 C- d, {1 z

三、BCB与Delphi中用ISAPI对Cookie的存取:3 Q* p1 l6 Q' g& u [注:Delphi用 .代替BCB的->]

' T% e% O* g" z: P6 H8 h- {

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, & {5 p9 n! c8 M: P3 C它也可以读取与存入Cookie变量:

; P# l; O. s: h2 ]7 f; h1 _0 v8 e; [

假设处理用户提交的方法如下: ! t: O5 e+ B, d0 u8 T% H4 T void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 0 {8 b9 k' P4 U; J- Y TWebRequest *Request, TWebResponse *Response, bool &Handled)

$ P* C R h6 N! \- u

1>从客户机中读取Cookie: 8 q% }5 j, n/ D8 n+ E* B1 z% x; }( ] Request->CookieFields是个串数组TStrings *,如果不为, s; L: G8 B Q" a- } 空,每一行都将是如下形式:# C& o) |) t$ a9 q$ T4 m Cookie变量名=值 % G; F9 c5 u% S6 s共有Request->CookieFields->Count个变量, 6 o+ o; Q6 y7 b6 R$ X变量名为Request->CookieFields->Names; (i>=0) # B% t9 o3 l* `/ vReauest->CookieFields->Values["变量名"]就是对应的值;, G8 _/ T8 J. ]8 N* y$ s: V 请注意: 客户首次访问网页时,客户机中并不存在你将要设的7 W ?8 `9 Z* o h3 A Cookie变量,所以第一次Request->CookieFields将是空的;

* t! |1 b5 k9 r. Y- a

2>将Cookie变量保存客户机中:" r3 W& {) \+ g( M( B. Z0 v' M TCookie *pNewCookie = Response->Cookies->Add();3 P" H$ S7 s# B. u* z1 T3 b pNewCookie->Name="变量名1"; ! v9 w' R( I+ y9 g pNewCookie->Value="值1";( X1 X0 C8 T5 C+ m pNewCookie->Expires = Now()+366; // 保存一年 3 I+ ^ w/ W- ]8 s5 L) P就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

, M# z6 F0 r. d" s4 w: E" @+ Y) }

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交+ p8 v. K# E! [" p( J5 c! \ .DLL后,每刷新一次浏览器,将看到计数值将变化一次:

, z$ F- e+ P4 A4 z, Q9 i

void __fastcall TWebModule1::WebModule1WebActionItem1Action(. A# f+ N6 m+ n3 e- S! K TObject *Sender, TWebRequest *Request, TWebResponse *Response, # @% _( k& p. E. O6 F bool &Handled)' F: s% P$ \3 f5 O p5 V {# _0 b- k% `, f0 h' n( Y$ p TStrings *cookies=Request->CookieFields;5 A5 y( S& F. t' q String oldvalue1=cookies->Values["count1"]; // 取count1旧值 4 u! y1 y- P1 Q9 W! P! \ f String oldvalue2=cookies->Values["count2"];

! S2 B8 |7 k/ L# H

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 / l8 A% c2 n) y# N: P; T1 ^ String newvalue2=oldvalue2.ToIntDef(0)+100;

: {9 m" q" k, `# ~

TCookie *pNewCookie1 = Response->Cookies->Add(); I% V e, S, X$ I" M7 Z7 E pNewCookie1->Name="count1"; file://更新Cookie {9 Q0 r; ]8 E$ [9 j. L! g# b pNewCookie1->Value=newvalue1; $ ?' |5 F4 l i* }1 o pNewCookie1->Expires = Now()+366; // 保存一年

6 z. ^; h% v, m& q% B; N& P n

TCookie *pNewCookie2 = Response->Cookies->Add(); ^5 h" g% j8 E' z a5 N pNewCookie2->Name="count2"; file://更新Cookie 9 F8 ^/ Z% r! ^- h# |8 n. \ pNewCookie2->Value=newvalue2; , P, g( L+ i& I9 [& d6 ]' ] pNewCookie2->Expires = Now()+31; // 保存一月

& D6 g% y# ]# e/ L1 j9 C

// 向客户显示Cookie的值: F* a b+ ]! X5 o! M% X9 ` String h0="<html><head></head><body>"; 9 @" p9 \3 {9 Q3 z1 h String h1="</body></html>";; |, O; H% J3 w( m String s1="计数值1="+newvalue1+"<br>";% M4 J2 O* `; M5 G- I9 J! I String s2="计数值2="+newvalue2+"<br>";

8 \- t2 s; ^$ Z3 b/ A( I

Response->Content=h0+s1+" <br>"+( n+ ?' }2 {1 @& h9 v: b) b s2+" <br>"+ h1;4 {5 k9 J4 ?( T4 h7 ?( N# s } : H7 T8 @1 F( }9 X4 t4 N

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 12:07 , Processed in 0.422260 second(s), 52 queries .

回顶部