QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

( e# q# A+ u6 l

一、 Cookie概述:

8 v6 E1 ]% s% h+ V% w. g

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。& T. f. C& R. x8 f' ? Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 ; Q/ E8 n% |) Y, q* a内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可: I f6 [9 q2 { 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量! a" Q" f- I& y4 E 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 & w) x5 K. g8 j! v, T2 U- p6 g所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网' y2 ?( E5 _/ k. k& v 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫' F- N: ~ t$ m, T 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, : |$ {2 C- A! j5 ]: S* @4 |$ [4 ^使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

; T6 K$ L+ ~* G) }. Z

二、JavaScript脚本对Cookie变量的存取: - N( o- w8 M5 K1 J0 { k+ d; L' B JavaScript是运行在客户端的脚本程序,用它可将文本输入 & X# p: ~( c- Z框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 4 Z- p3 k' Q' O3 F* J3 [& U微减轻Web服务器的一点负担:

0 | S+ X4 w( i, m; W9 h. P

1>读出Cookie: $ P/ Q9 M: X! b- O( A" b6 y JavaScript中可通过document.cookie访问到所有Cookie: ; e3 H' t/ ^7 \2 c+ W; V1 n* P "变量1=值1;变量2=值2;变量3=值3;" * ]' s6 \" C3 [3 q 需经过串分解就可得到每一个变量名及值; 3 t1 e+ \7 {5 [ 2>写Cookie: / R$ ~, y. ?) F+ ]+ t5 Y email="bush@usa.com"; 5 y* o b5 _4 p8 J firstname="jorge"; " q1 i( L2 z8 X lastname="bush"; 2 Z+ f; l4 n5 Q. u" X3 m3 J expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; : ]" b' m( z. b! G' V# O document.cookie="email="+email+";expires="+expireDate; # R3 [( d+ K% ?8 } document.cookie="firstname="+firstname+";expires="+expireDate; ( {% h) g& c2 v5 ? document.cookie="lastname="+lastname+";expires="+expireDate; 6 K( l% Z% k$ Y% i: W' Z4 y 下页一例,将网页的文本输入框域变量NAME自动保存下来:

; v5 z: b, g3 f0 @

<script language="JavaScript"> + K- ]/ P7 K5 y4 C4 N7 L* J9 }<!--% i2 U4 G, v ~+ N9 B$ F# l function getValue(s,n) // 分解Cookie表达式s 8 ^4 `- Y' C, w6 K6 o) A{( ^, \- ^/ P' o1 I var pairs=s.split(";"); // 分解成串数组. v" S, ?! [1 p for (var i=0;i<pairs.length;i++) $ C. j8 N% ]5 j: l$ |( Y6 ] {2 ~' E2 ]( A7 ]) T var pairSplit=pairs.split("=");+ j, r$ G/ O) ?" X1 E5 j if (pairSplit[0]==n) file://查找n; M" ~( i" E) U0 T6 e' l; m d2 ~ return pairSplit[1]; file://取到n的值/ g# k7 I! y+ w: q# k1 _ } ; h u) j# J. Q: u4 y- e8 p return ""; : m' |2 o( s( e H( i, B e}, i l O' T% U" F6 T0 z function getName() file://取Cookie中的姓名NAME 6 M& [/ o) k6 f+ i4 U$ L# n{5 ~! S' a1 K7 }; v var s=document.cookie; // 取所保存的Cookie0 b! H+ E* X; K& X NAME0=getValue(s,"NAME");- K3 _6 l" U4 M% Z7 o3 e form1.NAME.value=NAME0; 9 ]# A: P- ^! K1 V% I- R} , b% p0 P- U7 _function newCookie() file://将Cookie中存姓名2 G7 v8 i0 j d6 D+ O { 9 O! c$ X% ?3 a3 x- ]% ~ var s=form1.NAME.value; 4 b! f6 n9 s* F9 x: f d2 [0 p7 i if (s!="" && s!=NAME0) // 非空则保存 ) P/ |+ i# A5 r0 J% f9 y {* X4 E9 A% l! T9 l% Q0 S s="NAME="+s; / W/ A- x1 Y& y* [2 A: z6 L s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; " Z. u. R9 z. _0 n0 R# ` document.cookie=s; // 将保存到客户机中( \% k5 g, i: @8 o: f9 t } - D2 g% x- O8 Q& v/ N% t) `}5 w' p( q, J3 {8 V file://--></script>/ P) c+ m! B- E$ c" C) U* V' P/ Q( G ..................

# l6 a1 ]# q9 M# i+ F3 L

<body bgcolor="#00FFFF" onload="getName();# I/ K1 }5 N9 C T9 G, K form1.TEXT.focus()" onunload="newCookie()">: j" L3 U% d' \" z+ w/ @8 [6 x <!进入本网页时将执行onload中的getName()> % R# e& P; N; L) S: B7 [4 m( J<!退出本网页时将执行onunload中的newCookie()>2 D3 e& B1 `0 D* I ..................

6 u9 b6 V/ o9 n3 S

三、BCB与Delphi中用ISAPI对Cookie的存取: , [, e `: w9 o* N1 v V4 { [注:Delphi用 .代替BCB的->]

8 X) |+ v1 l, B n+ e

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, 8 W: ^2 l- w8 [. {, ~. @9 Q8 g( v它也可以读取与存入Cookie变量:

" P2 e8 P( u3 H3 M( R% W6 @! I: F

假设处理用户提交的方法如下: " ]7 z0 O9 L; l/ i# I/ M4 G6 u* Evoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, : H8 y0 R) v0 x; n) Z, H% q TWebRequest *Request, TWebResponse *Response, bool &Handled)

9 [6 k. u) K8 z8 ]( a

1>从客户机中读取Cookie: * a- q( H+ V s! q% X& e7 ` Request->CookieFields是个串数组TStrings *,如果不为, ?9 ^# [' i- K1 k3 V4 ^7 w 空,每一行都将是如下形式: ) V1 h2 E6 }* F6 m8 X5 [+ T, b7 ~5 n Cookie变量名=值2 }' K" H S$ x* z7 s0 w5 ~6 J) Y 共有Request->CookieFields->Count个变量,, \2 {& T0 P: p 变量名为Request->CookieFields->Names; (i>=0) % L* d; U9 \. n: yReauest->CookieFields->Values["变量名"]就是对应的值;3 k) R8 ~6 e6 s8 N, u- ? 请注意: 客户首次访问网页时,客户机中并不存在你将要设的 8 g9 k7 K7 o" X9 n5 s2 UCookie变量,所以第一次Request->CookieFields将是空的;

) b/ X1 }0 N: A7 q0 q$ @

2>将Cookie变量保存客户机中:3 e) e2 r; |' C% j TCookie *pNewCookie = Response->Cookies->Add();0 B- ]1 s1 o$ _& N( a0 w# l pNewCookie->Name="变量名1";. I( f+ g2 t' c pNewCookie->Value="值1"; ' A% z8 g* p$ c* i0 W2 e pNewCookie->Expires = Now()+366; // 保存一年1 d' l' G [- _; S8 \( ? 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

" N. P+ m- _7 S# y' `( G

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交8 q7 ?# |3 \2 ~* W6 c .DLL后,每刷新一次浏览器,将看到计数值将变化一次:

& W" u1 E' R6 X/ R* i3 x! i

void __fastcall TWebModule1::WebModule1WebActionItem1Action( . _3 c% r7 T1 w5 |$ Z, J* Y TObject *Sender, TWebRequest *Request, TWebResponse *Response, . v% g0 Z1 Z/ [; k" S4 k) r$ g bool &Handled), \, @& o: K* X |5 D2 k { % n6 d) W3 o& s: Z( }' k( D' `& ^ TStrings *cookies=Request->CookieFields; 6 H2 W" Y" U' Q# k String oldvalue1=cookies->Values["count1"]; // 取count1旧值 8 E5 F7 Y" o! D& z2 t. e8 ? String oldvalue2=cookies->Values["count2"];

2 Y( `' y6 }: ?7 O

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 $ }0 u0 a; ?1 m8 q String newvalue2=oldvalue2.ToIntDef(0)+100;

5 \0 ?9 Y8 I- Z) A$ F! G6 \

TCookie *pNewCookie1 = Response->Cookies->Add();+ g& p3 D" L2 `" k2 z" p+ M5 V1 v pNewCookie1->Name="count1"; file://更新Cookie8 C0 N" h1 z4 {1 ^4 z+ R7 S9 g1 k pNewCookie1->Value=newvalue1; . U5 j9 U- q$ H4 v pNewCookie1->Expires = Now()+366; // 保存一年

- `3 D4 p/ `! @ Z& t$ q Q$ k% L

TCookie *pNewCookie2 = Response->Cookies->Add();6 m' q3 z7 ]3 F9 ?! N5 b. N pNewCookie2->Name="count2"; file://更新Cookie - @1 N! w" m+ o3 W, ?& V pNewCookie2->Value=newvalue2;$ }. P% r% U, H3 w5 \, s pNewCookie2->Expires = Now()+31; // 保存一月

* n. ~) s7 C ~' I

// 向客户显示Cookie的值 0 G7 Y5 z% \, ~8 k. t4 N' A O2 ^ String h0="<html><head></head><body>";" s" _9 n, y# T( C2 U String h1="</body></html>";2 b! V' @# M: \ String s1="计数值1="+newvalue1+"<br>"; # i" s4 T2 ^! C* v String s2="计数值2="+newvalue2+"<br>";

1 Z: V, G/ h' K! v3 O, R

Response->Content=h0+s1+" <br>"+ 1 z# i' y) B( w, g s2+" <br>"+ h1;, u( w5 L, F+ b& A9 a } % w. l" I" _3 S

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-20 00:43 , Processed in 0.421493 second(s), 52 queries .

回顶部