QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

, [! _. y1 t& R! B6 ?# B( z- ~

一、 Cookie概述:

2 c+ _/ V; B0 f7 j

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。2 J0 Y3 N$ j, w, y" Q( u Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机1 N2 P5 T; s0 k- P( W 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可, l0 }" r- f- J/ |7 m7 _ 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量2 u8 G' R, _6 r- g; w 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 - d' F( p0 `; U0 y, h' ?所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 $ z- ?* ^+ G! E" [/ `页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫3 T0 G- R+ d. }- l" f, K6 Q 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,; r" Q* E* J: F8 u. d/ {, B6 p 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

& C4 w$ {( u& v

二、JavaScript脚本对Cookie变量的存取: 4 G5 Q% V2 q/ {( T Y4 j JavaScript是运行在客户端的脚本程序,用它可将文本输入- N9 N/ R0 Q' S0 @; V 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍' r3 o1 Z; f8 [: D: a7 Z 微减轻Web服务器的一点负担:

; W2 ~& ], t: D: F7 J, Y

1>读出Cookie:( |: Q' i# S& l* U. v. v JavaScript中可通过document.cookie访问到所有Cookie:- S9 U& E2 q9 x7 ? "变量1=值1;变量2=值2;变量3=值3;" 0 P' ? j/ H0 Y( t! U( a 需经过串分解就可得到每一个变量名及值; q& @' I/ w' f. G) ] 2>写Cookie:0 Y; w7 z1 N9 ` email="bush@usa.com";4 ]) Q2 p5 X! V% s; [5 c firstname="jorge"; , e4 a) q% m. D6 f lastname="bush";7 ~, R J9 [) Q expireDate="Thursday,01-Jan-2099 12:00:00 GMT";) u) s+ `, U: d+ u: T document.cookie="email="+email+";expires="+expireDate; $ S: c, f8 L8 s, q' `9 |% b: ~ document.cookie="firstname="+firstname+";expires="+expireDate; 5 W/ I! o1 i9 x+ j3 F document.cookie="lastname="+lastname+";expires="+expireDate; : k2 w9 i2 A0 |( z- X 下页一例,将网页的文本输入框域变量NAME自动保存下来:

; }4 E y2 `! U/ o

<script language="JavaScript">9 g) g8 g7 Y! H2 d <!-- 2 Z* a- b" `6 L1 afunction getValue(s,n) // 分解Cookie表达式s 8 S# f& U+ f8 [( O4 S C* I) c{ ' N) `( z1 G6 P7 k# L var pairs=s.split(";"); // 分解成串数组; R, p; n2 q3 J& a- i: v* L; F/ ^ for (var i=0;i<pairs.length;i++) 9 ^# p* R2 f$ ~# V {* j' O* m; Z% _/ A' r var pairSplit=pairs.split("="); 0 @, u6 V8 G3 x$ @ if (pairSplit[0]==n) file://查找n8 T# s, `& V3 f return pairSplit[1]; file://取到n的值 ' m% }& Z) ^+ k% o/ { } 0 Y9 \% F; V: ]8 O" k return ""; 8 U' b# B; s" E}; w% T1 B% b) w# j$ m2 T function getName() file://取Cookie中的姓名NAME $ o+ s8 j3 k3 w{ * f' n# X8 G& T! A( X2 K var s=document.cookie; // 取所保存的Cookie 6 V4 _* @, N1 v. s' w$ E ~% ^ NAME0=getValue(s,"NAME");# u7 s5 F, V9 k& Q2 O) i form1.NAME.value=NAME0; ( p. a1 t. J m! Z}0 L7 K. [! R# N function newCookie() file://将Cookie中存姓名, _0 o% U% g( z. d+ E7 B { 7 E% A7 {" R! n- c var s=form1.NAME.value; ! Z( V* G& j2 a+ G if (s!="" && s!=NAME0) // 非空则保存/ f& y- W. L/ Q% V/ J {$ ~, }; x5 b! L; ~0 |2 ? s="NAME="+s; & `. T% E9 F& _( ~9 E: u9 {5 D s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; - o% {# z% M P9 z+ n7 t) @ document.cookie=s; // 将保存到客户机中 0 @) @" H) K8 m& _+ ~ } : |' t$ Y8 L* k1 X}" s0 `. e( H9 M) A L2 o; _2 a file://--></script>! m. h) P3 W5 ?+ u8 g" O u+ p% B9 T ..................

# d A( m- y# O8 D2 N' M0 V

<body bgcolor="#00FFFF" onload="getName(); & b/ Q3 ~$ u6 Y$ V- T0 _1 Q form1.TEXT.focus()" onunload="newCookie()">7 Y- {. o, V/ Z6 [: k <!进入本网页时将执行onload中的getName()> 6 s4 R- p5 O0 \9 g<!退出本网页时将执行onunload中的newCookie()>* T( a0 M+ m2 H$ m( d ..................

, T8 O, }; y8 @9 m3 u

三、BCB与Delphi中用ISAPI对Cookie的存取: 2 h! L3 Z) w, c/ } [注:Delphi用 .代替BCB的->]

, |9 l+ @* C& K( q, [% M+ w

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, 6 K1 o; ?0 j0 V$ I" a3 ? N它也可以读取与存入Cookie变量:

+ A# r& d+ b0 L; l$ |, g

假设处理用户提交的方法如下: ( x* M. m4 ~! X void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 6 ~1 \2 d3 K/ ]$ B7 G7 Q+ C1 Z TWebRequest *Request, TWebResponse *Response, bool &Handled)

4 c1 U' o( n6 y( B; g3 Y: j: t

1>从客户机中读取Cookie: $ \0 Y5 u4 ?1 V7 f Request->CookieFields是个串数组TStrings *,如果不为 5 Q4 y& @+ N f; @9 J空,每一行都将是如下形式: ; V' ^( C% s+ k/ p0 G: f Cookie变量名=值 , p- d- u& f1 U( s共有Request->CookieFields->Count个变量,( R/ s' G/ }1 O* a1 y 变量名为Request->CookieFields->Names; (i>=0)7 q' [; R. g p" K3 W, |( \% D- ? Reauest->CookieFields->Values["变量名"]就是对应的值;+ Q8 `4 K3 R* O' c2 W, J 请注意: 客户首次访问网页时,客户机中并不存在你将要设的0 G! q9 [# a* F" H$ b6 @ Cookie变量,所以第一次Request->CookieFields将是空的;

7 I8 e! l" x# d6 R1 s

2>将Cookie变量保存客户机中:4 c4 e7 h* ~! X; M TCookie *pNewCookie = Response->Cookies->Add(); 4 h, u2 B. J% p: v9 y9 J. P pNewCookie->Name="变量名1"; . r. O% a4 d5 e( { pNewCookie->Value="值1"; 9 k) K2 B8 R1 N pNewCookie->Expires = Now()+366; // 保存一年, W& e* r& M6 M* a9 X" {! h 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

3 x3 l2 J- H Z5 g1 B) B

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交) x6 \6 t2 h' p- @, p .DLL后,每刷新一次浏览器,将看到计数值将变化一次:

+ e4 ~! ~7 F& k l/ w2 [; O0 h1 ?

void __fastcall TWebModule1::WebModule1WebActionItem1Action( ( c: i& x1 S% v% A/ G TObject *Sender, TWebRequest *Request, TWebResponse *Response, b7 Z/ c1 P: O bool &Handled) 7 A7 l4 v. H ^9 l7 ?5 N M{ 9 u- {: B' C% K- d- x( ?. } TStrings *cookies=Request->CookieFields; ! e4 N! P' q& D) F' m String oldvalue1=cookies->Values["count1"]; // 取count1旧值 & z( @. T) i& g9 z' R. \, | String oldvalue2=cookies->Values["count2"];

5 i+ R7 H6 W$ T3 r3 |* F8 j" Q

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值3 ` z4 g: z4 }4 S" R5 C String newvalue2=oldvalue2.ToIntDef(0)+100;

5 C. F" B" p( R6 q! y

TCookie *pNewCookie1 = Response->Cookies->Add();% R4 V' ?' v' _0 g3 D8 ] pNewCookie1->Name="count1"; file://更新Cookie6 @5 b9 t# S4 `* q pNewCookie1->Value=newvalue1; ' o. p* z- m; y1 y! b pNewCookie1->Expires = Now()+366; // 保存一年

! ]6 c% Q) ]7 y0 {

TCookie *pNewCookie2 = Response->Cookies->Add(); + K" q3 J1 F" p( B/ d pNewCookie2->Name="count2"; file://更新Cookie 9 {! H9 e! t5 Z0 ]4 z- O pNewCookie2->Value=newvalue2; 8 f/ W! K" [' E0 p( {$ V pNewCookie2->Expires = Now()+31; // 保存一月

5 y. o, `) w8 b" D" w

// 向客户显示Cookie的值8 H6 K( F& M- U4 x8 x' A+ g String h0="<html><head></head><body>";, S% J5 C7 m0 t! L& R6 d String h1="</body></html>";8 I: i4 H0 I3 K" p% S- o String s1="计数值1="+newvalue1+"<br>";/ n4 J/ l# N( a( J3 x, q String s2="计数值2="+newvalue2+"<br>";

( n- b8 r: P$ p) f8 C7 J4 j

Response->Content=h0+s1+" <br>"+5 O0 g6 a* Z! N1 w$ G. u s2+" <br>"+ h1; 5 ^" A5 r* ]4 b} 5 J( I& v* n7 l* k

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

回顶部