QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

7 x# C, |& s' h7 d) k

一、 Cookie概述:

- z" e3 T$ }1 A" `( E/ a& h/ W

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。& v" Y! ~8 J+ n. ?% m; g4 Q) A; H Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 $ Q* `7 u9 y2 A/ J1 I4 e: i# l内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可! g: q1 {: q# C, A; K 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 7 N9 D) o) `) h/ G的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 % t3 }0 _6 g( e6 p所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 4 _' |- T* a, f+ _- Z$ U* y页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫6 A; g' {! q: e# W! ]+ R5 y- J- p 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,3 S/ J/ H4 g: `2 U 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

6 N! z$ Q- u; {5 p$ a+ I

二、JavaScript脚本对Cookie变量的存取:" q6 h4 m, G6 s" k% Y2 b JavaScript是运行在客户端的脚本程序,用它可将文本输入 ) @2 E3 E! W( r' \* x! @框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 4 H+ c8 y$ Y* Y) a+ q微减轻Web服务器的一点负担:

) W( d! @0 J1 Q b* A) v

1>读出Cookie: , F9 W3 A5 N m JavaScript中可通过document.cookie访问到所有Cookie: , K, e& w/ @6 A* M1 \! l( x "变量1=值1;变量2=值2;变量3=值3;"/ o* g1 D# b8 l, {% b: m 需经过串分解就可得到每一个变量名及值; 8 B; c7 p! J: R! V9 J9 l 2>写Cookie:$ \8 K7 L7 D. @9 } email="bush@usa.com";! ~- T7 y w r) c! X; E# u, ~ firstname="jorge";* U/ m* N& m3 M0 P( r2 @ lastname="bush";+ g G0 z! O9 c* ]6 w expireDate="Thursday,01-Jan-2099 12:00:00 GMT";6 p5 `+ u9 \$ ?6 A$ k. {! z document.cookie="email="+email+";expires="+expireDate;; N Q4 h# d( }+ N& c document.cookie="firstname="+firstname+";expires="+expireDate; . N; ^2 O. ~! z, c" c document.cookie="lastname="+lastname+";expires="+expireDate; # e. |; w; U. t6 p6 j 下页一例,将网页的文本输入框域变量NAME自动保存下来:

4 U, N. j( }5 l: X; {

<script language="JavaScript"> 2 R* v5 t+ b* b1 z' J! o, L<!--, n& S; M4 H- X% ?, N6 ?% t6 h function getValue(s,n) // 分解Cookie表达式s/ I: C7 j9 w0 c% J* h7 S { ) \+ Q9 _0 e ^3 g" s var pairs=s.split(";"); // 分解成串数组 5 u* o E* I+ Z7 [ for (var i=0;i<pairs.length;i++)! h5 v6 |# {7 B$ R& L, o; U" L" B { + s0 x- }& r4 e; \ y var pairSplit=pairs.split("="); ) y4 K$ w3 r W* y if (pairSplit[0]==n) file://查找n # ~. m3 ]/ b: J$ N- g return pairSplit[1]; file://取到n的值$ r) @- k! g. R9 G } 9 u- \& j: z6 A, Y' J return ""; ; i3 C% d/ A! ] Y0 G, ^% Z4 f: t}. Z4 H( \% _- ? d) h function getName() file://取Cookie中的姓名NAME 5 C) X2 ~6 }* i$ J8 O$ p{ ; r4 {: [! p ~9 @ var s=document.cookie; // 取所保存的Cookie, I8 {& D$ H0 d% n NAME0=getValue(s,"NAME");8 D5 m$ P1 z% T form1.NAME.value=NAME0;6 ^7 `" u, M4 ^) \0 U+ e0 } } 5 ]2 a( b# O# t& l. Lfunction newCookie() file://将Cookie中存姓名 9 u8 ]* h ^" h1 ]{5 {" z3 d5 f! S8 X0 y; N% q& h var s=form1.NAME.value;$ j E1 w- X# Z* V# p0 i if (s!="" && s!=NAME0) // 非空则保存 ) l U; l" j6 Y {* X! l; c* w+ Q1 Z5 i s="NAME="+s; : e2 k* u& n5 z, s s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";: m" N2 \" J/ I7 }5 X$ l0 P1 B document.cookie=s; // 将保存到客户机中 * {, D4 J' ~/ f0 Z9 | } 1 J6 z- o/ ^3 _- c ?( M7 u9 q }4 X3 J6 c4 X2 y7 a" j' W file://--></script>$ i+ g/ @: H4 U/ x. G ..................

1 s+ g0 D4 S* K' R3 X% r- w

<body bgcolor="#00FFFF" onload="getName(); ' d+ F* J4 Q. t$ N7 m+ n; [, d form1.TEXT.focus()" onunload="newCookie()">3 W8 U: Q# D4 l <!进入本网页时将执行onload中的getName()> 9 ^) S% {4 R0 A" q! j<!退出本网页时将执行onunload中的newCookie()>: V0 f$ t2 Z g5 A ..................

6 J( C3 Q2 k( `$ y; [1 s

三、BCB与Delphi中用ISAPI对Cookie的存取:! }- n2 I. x; {" D9 \# { [注:Delphi用 .代替BCB的->]

; s6 o0 R2 U1 A

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, / V3 \* B* s7 k/ {' J$ l4 b它也可以读取与存入Cookie变量:

" [2 K2 U$ ^% F- u1 W# I

假设处理用户提交的方法如下: + b/ Q5 l! [3 Y void __fastcall TWebModule1::WebModule1Action(TObject *Sender, 3 V1 n4 s! ~' r TWebRequest *Request, TWebResponse *Response, bool &Handled)

9 U# f! d) Q0 i* G

1>从客户机中读取Cookie: - ?% f7 k6 E* G- D. t# w Request->CookieFields是个串数组TStrings *,如果不为4 G1 M* _. v' b, g) u 空,每一行都将是如下形式: n6 C, [# C% Z- ~2 N3 ^' [ Cookie变量名=值 ( c$ S: [! G/ ? P4 G" K+ r6 h共有Request->CookieFields->Count个变量,0 A1 v' s$ O1 o5 K/ L) ? 变量名为Request->CookieFields->Names; (i>=0): e4 ~8 l5 g! R1 r Reauest->CookieFields->Values["变量名"]就是对应的值; }! S. S$ C1 S$ a6 W S# |请注意: 客户首次访问网页时,客户机中并不存在你将要设的 3 I) [% g4 h; P2 F- h7 HCookie变量,所以第一次Request->CookieFields将是空的;

% l& c9 Z- t4 P. u' q; V& `+ {

2>将Cookie变量保存客户机中: % k; `" Q8 R: |. ^5 z TCookie *pNewCookie = Response->Cookies->Add(); , F& r" _. Y; @& ~* @5 w! U pNewCookie->Name="变量名1";, x8 i, B- n# l2 V, B pNewCookie->Value="值1";: c( D9 l7 Y w; L9 Y3 d* [ pNewCookie->Expires = Now()+366; // 保存一年 0 P x5 A9 f4 D: }就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

% z+ f/ S! \9 M: N8 Y' o) J9 @

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交5 y7 l! m) R# o5 }8 y2 w .DLL后,每刷新一次浏览器,将看到计数值将变化一次:

/ ?$ f _: V( F$ j3 {1 L* h1 Q

void __fastcall TWebModule1::WebModule1WebActionItem1Action( $ s! E7 Q) z- j/ A9 X TObject *Sender, TWebRequest *Request, TWebResponse *Response,& [* z0 N& x! z( X4 ^ bool &Handled) ( l( I( \* [2 o" N0 K{ 1 r& T8 L/ L4 ?( _4 E7 h TStrings *cookies=Request->CookieFields;# Y. p ^, o8 o. C+ t String oldvalue1=cookies->Values["count1"]; // 取count1旧值3 Y. z! h5 y3 S, j* u( } String oldvalue2=cookies->Values["count2"];

0 \3 u: I6 d+ S% z6 v. l

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值4 C) `) \3 K" o, q% l. i' r$ x String newvalue2=oldvalue2.ToIntDef(0)+100;

6 z( M2 x! l" C# O; z

TCookie *pNewCookie1 = Response->Cookies->Add(); . N6 `5 [- S" _/ w pNewCookie1->Name="count1"; file://更新Cookie8 r5 N( i- X R pNewCookie1->Value=newvalue1; 8 X: l4 X" q E: N: x5 D6 g; h pNewCookie1->Expires = Now()+366; // 保存一年

: H+ {8 J8 P" f. L2 _# @: R3 B

TCookie *pNewCookie2 = Response->Cookies->Add();! U$ {6 t6 c2 t% D3 W" `; p# a pNewCookie2->Name="count2"; file://更新Cookie + m/ y- z: n- S8 W. k pNewCookie2->Value=newvalue2;$ g9 }9 L; |. m- I0 L pNewCookie2->Expires = Now()+31; // 保存一月

" ]% J3 Z0 x5 a. u. X) Q! q# t+ Y9 w: R

// 向客户显示Cookie的值$ a( ^7 B( e# r( m# w String h0="<html><head></head><body>"; 1 A+ v7 O: A( `" p( d4 m String h1="</body></html>";$ u4 U' Z4 `9 L: A0 Q String s1="计数值1="+newvalue1+"<br>";$ I' l0 B2 B( K: U$ ^ String s2="计数值2="+newvalue2+"<br>";

# \; K1 b4 w5 _; p n, Y, [

Response->Content=h0+s1+" <br>"+" r* t/ \- l2 l: Z+ n( f* `: j s2+" <br>"+ h1; 3 d8 {; ?4 C- W} / i4 ?0 g! \ j0 I# B

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

回顶部