QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

5 N; e+ a& `3 D& \$ E& D

一、 Cookie概述:

- a1 K" C. \4 K5 S

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 ( W2 C% R" A; r, n5 Z) A& c: H Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 # v( V" r$ I5 \! O内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 S" k0 z; p" z% Q( r! s- D测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量. p8 n$ N2 ~2 Z$ y, o. L 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 % ?7 B4 H4 `7 k6 ~1 U6 d' ]* y所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 ; _0 }0 i' Y* G4 f页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫- Y0 [- M6 I8 p! u" f 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,! w8 B" A) M9 G3 x 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

) t5 ]( @* l6 C# i# ]* \& \; Q

二、JavaScript脚本对Cookie变量的存取:, K5 z5 j8 s6 S$ m0 {* V- c& H7 N JavaScript是运行在客户端的脚本程序,用它可将文本输入+ e* M; O7 G# ^% g& i 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍1 A2 S+ E2 {) N, g* P. U3 ~& f7 B7 H& O 微减轻Web服务器的一点负担:

4 }/ i% B- p5 A) R8 F0 ]% L

1>读出Cookie:5 e4 Y1 U& X' c& P8 ` JavaScript中可通过document.cookie访问到所有Cookie: % ` X; z# i* m1 n9 h "变量1=值1;变量2=值2;变量3=值3;"5 I1 N7 l# R+ I1 A7 T% h 需经过串分解就可得到每一个变量名及值; : `+ I2 X/ T2 t8 i" c" s1 Y8 o 2>写Cookie:# u& }, |6 R! e1 U j7 ] email="bush@usa.com"; 6 r. M P. t& K# ?/ k" P8 A& l4 c firstname="jorge";3 C4 l$ u2 p6 g; \/ y lastname="bush"; & B0 D( s. }% K! \" o0 X expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; + y: \, X! r5 D S- n C document.cookie="email="+email+";expires="+expireDate;; A* |( o8 M" H4 Z$ B; {3 P document.cookie="firstname="+firstname+";expires="+expireDate; " o/ H) b7 M' \: b+ V% } document.cookie="lastname="+lastname+";expires="+expireDate; / Q6 D% r$ N( S0 E* [5 D1 i 下页一例,将网页的文本输入框域变量NAME自动保存下来:

( q9 p( T1 g# d* G/ O0 }

<script language="JavaScript">) m9 l$ N6 K1 G/ U/ ] <!--9 O3 J! u0 g/ Q3 W' O, z9 t function getValue(s,n) // 分解Cookie表达式s 2 G; X' c8 N) ~$ Q3 x{) h3 ?: @# o- N% ]1 I- ^ var pairs=s.split(";"); // 分解成串数组 + n( Z- Y& f* C for (var i=0;i<pairs.length;i++) . b" r& p3 [2 f$ H3 v3 y3 | { 8 V$ { {5 j% h/ k8 T var pairSplit=pairs.split("=");9 I2 L' `& f" O8 _ if (pairSplit[0]==n) file://查找n N; ?8 U2 Q: M/ B( l, ] return pairSplit[1]; file://取到n的值, a. g- T/ p: u1 B& w+ }* Y } ' ?3 x2 B4 g6 | return ""; 6 ~+ G6 S6 f8 F$ [} ) o% M$ u H& q1 @# Efunction getName() file://取Cookie中的姓名NAME : e! h2 a4 R. g! b+ h" Y{ # i/ _3 O. n( y; C0 I! I var s=document.cookie; // 取所保存的Cookie & R4 J: ^: x& u( M' @5 H5 I NAME0=getValue(s,"NAME");2 O3 k4 o. g1 C form1.NAME.value=NAME0;& x' [$ N- D1 W6 R" g }/ W) v Y9 t' ]1 }' P. \ function newCookie() file://将Cookie中存姓名% j* ^( i3 f" \5 A- a {$ c: \! U& k0 m6 O$ t# F$ M var s=form1.NAME.value; 1 R( m) @& M5 d% H: N- B if (s!="" && s!=NAME0) // 非空则保存 0 G6 U- Q$ R; w$ y2 ^, m) y {3 ] x8 {- l% {; V s="NAME="+s;( x# S) O( E" ~1 ` Y6 s* Y0 n' \ s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";- x2 y l! G3 C7 x/ } document.cookie=s; // 将保存到客户机中$ o* ~& D1 m/ C" C2 Q; e } , ?! I/ F; w' G; [ } ' d" E' L2 N; M! d% Q- i+ Dfile://--></script>' r9 M4 E* N$ L3 p3 ? ..................

1 h1 g; p4 @4 V: Z) B" a

<body bgcolor="#00FFFF" onload="getName(); ( b: h5 q* Q' M4 X: S5 j form1.TEXT.focus()" onunload="newCookie()"> / S0 w) Q6 X; ?. y5 { Z- v% ^<!进入本网页时将执行onload中的getName()># h1 E7 J1 R' r <!退出本网页时将执行onunload中的newCookie()>8 d3 R% Q) p: ?2 u ..................

1 V* g- |( N" p# Y4 `& V

三、BCB与Delphi中用ISAPI对Cookie的存取: ' e* T0 m! h. ?' h) n$ K7 i [注:Delphi用 .代替BCB的->]

- O5 c! V8 b! Z9 @ B+ N

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,+ Y; V$ g( W7 f' N {" x 它也可以读取与存入Cookie变量:

3 W4 M h ~, h( l

假设处理用户提交的方法如下: ! s |; T2 }; e; e5 i8 d1 D7 wvoid __fastcall TWebModule1::WebModule1Action(TObject *Sender, . j6 r* f; R+ q$ P( r+ j) W4 J' B6 DTWebRequest *Request, TWebResponse *Response, bool &Handled)

: \# L0 ~7 b9 |& s4 y- j! {

1>从客户机中读取Cookie: : A, y; x* \( j7 N- a Request->CookieFields是个串数组TStrings *,如果不为 $ S! a# m5 ]1 U- |6 V; e! p空,每一行都将是如下形式:3 s4 y' m+ t' X+ z# a+ k Cookie变量名=值 $ P! K: A! _2 `- v! u) a) N: s# b共有Request->CookieFields->Count个变量, 5 T/ Q+ j! @6 _4 v+ S. `变量名为Request->CookieFields->Names; (i>=0) ( U$ f! N$ @2 @) DReauest->CookieFields->Values["变量名"]就是对应的值; 3 ?3 B* V/ l, |# p# I请注意: 客户首次访问网页时,客户机中并不存在你将要设的 # ?# l8 `$ P$ UCookie变量,所以第一次Request->CookieFields将是空的;

* X6 F5 T' N1 ?( ]4 {4 x

2>将Cookie变量保存客户机中:8 G) d7 a$ V. Y! K: A# I TCookie *pNewCookie = Response->Cookies->Add(); 3 ]: |( M# e- r, Q8 ~ pNewCookie->Name="变量名1"; 1 u5 G+ i: x) Y, P/ i8 n pNewCookie->Value="值1"; ; z- T$ v* p5 |& L- g pNewCookie->Expires = Now()+366; // 保存一年 ! U |+ T( f8 O$ J就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

9 I/ R; J) ^4 m$ p) Z* z/ c# b' q

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 $ N$ y t2 h* U; n& k( X( h& K6 N.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

' ?. f( u4 I& e/ q- V# t; o% i

void __fastcall TWebModule1::WebModule1WebActionItem1Action( . N/ F0 o6 S0 m* |) t/ h) p TObject *Sender, TWebRequest *Request, TWebResponse *Response,7 K# T! L4 p* y" p& z* Y' ]3 @ bool &Handled) 2 U/ e. d( c/ B$ e2 Z4 g: @{+ t! p" } h' I& g' P TStrings *cookies=Request->CookieFields;' |5 i! s* [9 n7 c& u& ?3 w String oldvalue1=cookies->Values["count1"]; // 取count1旧值- `- H, i) [8 Y X. p8 G* w+ n' D String oldvalue2=cookies->Values["count2"];

* i7 q3 `, X8 J( A

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 6 x n T/ U* X% E" h String newvalue2=oldvalue2.ToIntDef(0)+100;

. ^/ P, ~; j0 m% ~ i

TCookie *pNewCookie1 = Response->Cookies->Add(); 1 @) G. S% s+ ~2 Q! N pNewCookie1->Name="count1"; file://更新Cookie * a- C7 X: v+ j( Q3 Z pNewCookie1->Value=newvalue1;. C2 j* N! N9 t* N7 w: u pNewCookie1->Expires = Now()+366; // 保存一年

( j# u7 ^% Z8 Y8 O2 o% |

TCookie *pNewCookie2 = Response->Cookies->Add();4 h8 p2 j+ j, T pNewCookie2->Name="count2"; file://更新Cookie 3 S$ x2 r8 `0 l- K Q# { pNewCookie2->Value=newvalue2;: u! {' A5 ?2 } b$ x ~ pNewCookie2->Expires = Now()+31; // 保存一月

% B4 {( H) `# b1 o7 p; f9 `

// 向客户显示Cookie的值+ d! X; N9 Q) G3 L- Y String h0="<html><head></head><body>"; % G6 r' e9 C2 }4 O+ g: }: N String h1="</body></html>"; # c) Z7 i/ Y! C( ~ H String s1="计数值1="+newvalue1+"<br>";7 t- u; [% y* a3 I String s2="计数值2="+newvalue2+"<br>";

: }9 u1 q4 j: w% B1 X

Response->Content=h0+s1+" <br>"+ 5 v- B+ I. }" F& P0 m$ s s2+" <br>"+ h1;6 M0 ?* q3 _) k) D5 n3 w/ U+ w } 6 n8 d6 I% {! b- c) A6 f! 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-4-19 05:54 , Processed in 0.419145 second(s), 52 queries .

回顶部