QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

0 r6 W0 d& |6 U* I9 y/ N

一、 Cookie概述:

# v& t+ \ a4 ^8 L

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。: z. E) K2 F+ m+ I Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 6 N! I9 s ]) i$ N! k8 {: L% a" d内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可- i1 j/ Q' S) n6 ]4 y3 P9 N 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 / f" U6 X/ A8 a- ~" e的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 2 Y2 b* Z* @5 k& e5 F2 [, k所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 + }: \' o$ @- C! Q页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 ' [. t" ]* n% C+ H) B小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, 7 b9 r! R _! _) E @: {. |, w使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

/ A0 U/ N, j# e M1 r$ v3 U2 ?

二、JavaScript脚本对Cookie变量的存取: 0 [* R- q4 t+ n/ r) R: h JavaScript是运行在客户端的脚本程序,用它可将文本输入 : J/ B$ M, ?' I: t' \. x" g6 G D2 f! x框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍( K5 M& Q9 y# @( K 微减轻Web服务器的一点负担:

# h) g8 t6 | q* e4 V

1>读出Cookie:; Q3 s B6 f5 u1 p3 G2 T$ b JavaScript中可通过document.cookie访问到所有Cookie:' E$ Z& | z, t. m7 X2 i$ U+ u "变量1=值1;变量2=值2;变量3=值3;" ) l( X" p. q# ~# }! |$ h/ T8 p6 B. U 需经过串分解就可得到每一个变量名及值; . Y0 y/ r$ U, `( ~ u8 ? 2>写Cookie:! y7 d9 n- c. _' ]9 _ email="bush@usa.com";: s- d( C5 q5 o) P firstname="jorge"; " x3 |1 G$ B/ W$ M lastname="bush"; - ^- }0 O, S" k1 c* Y expireDate="Thursday,01-Jan-2099 12:00:00 GMT";% {5 J$ B9 `* N0 p) h* |5 f: P document.cookie="email="+email+";expires="+expireDate;$ N* k; d5 o! n; b, N( ~ document.cookie="firstname="+firstname+";expires="+expireDate; % g- ]* [6 e3 H, l* k& r; X3 E document.cookie="lastname="+lastname+";expires="+expireDate; - H6 K' K' f% O- H0 h3 `6 ^ 下页一例,将网页的文本输入框域变量NAME自动保存下来:

+ T/ o: y: W& `8 a: c' _) i

<script language="JavaScript"> % m% H- k% V* Y9 }3 \. I* ^<!--/ I' w3 d- @( u function getValue(s,n) // 分解Cookie表达式s, E6 o, N8 _) i { % s; e7 x& T1 o4 ? var pairs=s.split(";"); // 分解成串数组. g: N9 S. m+ n6 R8 N: k for (var i=0;i<pairs.length;i++) 5 p+ C e$ u8 G { 9 Z. i( F' k( y$ N var pairSplit=pairs.split("=");3 H( [( K, v! n, [# J3 Q if (pairSplit[0]==n) file://查找n : w7 n3 g4 H/ ]' {7 c" @2 O( D return pairSplit[1]; file://取到n的值; w; r6 A! p$ S) i5 S } ( E5 S& x K- a1 c return ""; " _7 G" X/ x. C- J$ S& S2 L}1 T/ F% F G1 O/ Z% h function getName() file://取Cookie中的姓名NAME' Q+ k9 E7 Y- r& \9 z8 c { ( [$ c9 U( T* L9 E; q var s=document.cookie; // 取所保存的Cookie* _+ K d) r! O7 s r: i NAME0=getValue(s,"NAME"); ) \6 v8 Q4 e: @( [( f form1.NAME.value=NAME0;' M0 `9 ]: t& X q* D }$ u7 @, m. m% Q! w5 }: L+ { function newCookie() file://将Cookie中存姓名* i/ r: w: L) f" J# z' _' U. V {5 ]; H% D; Q- G0 ]4 ]( ]! g# p$ [ var s=form1.NAME.value; 7 w( U l- K% ~5 v n4 f& P if (s!="" && s!=NAME0) // 非空则保存" |" N' J/ n- W, a { : p; Y1 D$ K" `/ ~6 `% Z( O; a s="NAME="+s;' Y% B6 j; A" W* k s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; 6 k, C0 l- Q- f5 n3 N# [$ I# { document.cookie=s; // 将保存到客户机中) b. E; ~& V6 Q: D& Y7 @ } $ m+ n5 A1 H7 j} , `6 C2 ]' O* r5 ?8 zfile://--></script>& z4 K& B8 J: E ..................

6 y0 S# N8 I. \. w' A$ J: {! @

<body bgcolor="#00FFFF" onload="getName();7 K5 F. m4 X' _5 H+ v form1.TEXT.focus()" onunload="newCookie()"> 3 v, x; |/ E2 G; J6 d<!进入本网页时将执行onload中的getName()>, e* v r: o' j: T( B( } <!退出本网页时将执行onunload中的newCookie()> ; ?; B; k* j) R4 s8 S4 q" [/ l..................

: j' |& G; ?( _4 @3 G

三、BCB与Delphi中用ISAPI对Cookie的存取:% j& L2 i" [, h8 u4 G [注:Delphi用 .代替BCB的->]

7 t) g: [# x. X" U4 j

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,$ }& u& k$ s$ j$ }; }0 l. K 它也可以读取与存入Cookie变量:

5 F, ?8 a5 z0 `- h( c

假设处理用户提交的方法如下: 9 w" z6 Z1 m+ X( bvoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, 6 g, e( {4 c3 o) q# A& J" P D TWebRequest *Request, TWebResponse *Response, bool &Handled)

; |. g5 ]" t* ^' E3 T4 c

1>从客户机中读取Cookie: 8 j& Z( D1 s4 i1 r! ? Request->CookieFields是个串数组TStrings *,如果不为" l2 \4 O# d/ a) g/ a P) }1 _9 J 空,每一行都将是如下形式:, I) ^+ n4 G& j9 ?3 o6 R) e. t# b Cookie变量名=值 8 Z& p* Q' _4 E, n& W共有Request->CookieFields->Count个变量, $ K4 U; K8 C8 N变量名为Request->CookieFields->Names; (i>=0)# D! T4 Y6 |' Y Reauest->CookieFields->Values["变量名"]就是对应的值; 3 H9 }. X' {* G8 X0 S请注意: 客户首次访问网页时,客户机中并不存在你将要设的 1 ?! e8 x; d& G( |, _; Q6 S; f. ]$ ?Cookie变量,所以第一次Request->CookieFields将是空的;

. o: P4 Q. U) v b8 X2 N

2>将Cookie变量保存客户机中:# {3 b4 s0 V2 c) [9 v) i! v% P TCookie *pNewCookie = Response->Cookies->Add(); / T7 S2 I+ K$ |) e3 U. v pNewCookie->Name="变量名1";4 h4 C8 R: m# X) `# i. D* ` pNewCookie->Value="值1";9 J9 p" h! b# S9 O2 m pNewCookie->Expires = Now()+366; // 保存一年 , z* X4 t0 _) r' u5 J就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

+ L9 g, A5 q4 q" r

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 0 @" j& V* h8 i5 ?.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

S# h/ C: {( w: g

void __fastcall TWebModule1::WebModule1WebActionItem1Action( 6 j+ x0 a `, k! \& U' Z( | TObject *Sender, TWebRequest *Request, TWebResponse *Response, # y C' ~2 _5 M bool &Handled) & |6 g! n5 C; K7 i7 Q{2 Y) O$ x+ p& k( K1 H TStrings *cookies=Request->CookieFields; 6 o& j8 c0 S4 |5 y8 Y8 k6 W6 p String oldvalue1=cookies->Values["count1"]; // 取count1旧值 1 t/ \6 ]7 w2 k String oldvalue2=cookies->Values["count2"];

& p# o# e8 X8 E& X+ t5 @- u5 X

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 # `: g8 @ Q" f+ A String newvalue2=oldvalue2.ToIntDef(0)+100;

% ~7 Z! }4 o' ?

TCookie *pNewCookie1 = Response->Cookies->Add(); 7 q" i, \: y! K) F pNewCookie1->Name="count1"; file://更新Cookie 3 t8 z7 W: k, I0 W9 b8 a pNewCookie1->Value=newvalue1; L6 \8 I& n' g. _" `! D pNewCookie1->Expires = Now()+366; // 保存一年

; w0 V/ r0 J: O5 v7 }. |+ {

TCookie *pNewCookie2 = Response->Cookies->Add();- i. A8 m2 ]/ y, `$ Q2 O pNewCookie2->Name="count2"; file://更新Cookie * N2 x) y7 }, x7 K1 E pNewCookie2->Value=newvalue2;1 b1 I) t' Z' T9 Y- P pNewCookie2->Expires = Now()+31; // 保存一月

! I' r( C$ H1 t( m _9 g

// 向客户显示Cookie的值+ [3 f( k/ a/ ?, e. ^. ?: G String h0="<html><head></head><body>"; 9 o5 Y5 A2 u# [ String h1="</body></html>";" D* ~3 B1 r+ C String s1="计数值1="+newvalue1+"<br>";( d6 m2 M# u/ _" U' m String s2="计数值2="+newvalue2+"<br>";

- A2 ~' f, k* ?9 z9 ^

Response->Content=h0+s1+" <br>"+ 4 M: X, C( l( d9 _# G5 g s2+" <br>"+ h1; 6 }% ]- t9 I& x& }} 3 z4 x* g! `6 X! ~

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-16 18:56 , Processed in 0.402800 second(s), 54 queries .

回顶部