QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

! s- _5 ~ i; B |

一、 Cookie概述:

( M" ~) \4 G, N$ Y- U1 g" E/ Q

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 " M. ~* B+ J6 i0 t) L7 n6 A$ s Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 ; K) g- u7 Q# J" Q& P内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 - j& i0 r; u$ n2 z5 s' }% q测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量- l- {. ~2 a X; a7 V5 m+ D 的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 ; H9 f+ n; `; }0 K% h所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网1 g: A- M- R/ C9 n7 m' `- F& | 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫+ u% d y& I& m! e' G! n 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,0 S3 }9 b9 w6 J9 a2 C: h+ Y 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

9 g+ a, ^3 u2 K, s: w+ f# P

二、JavaScript脚本对Cookie变量的存取: s7 p/ e. W4 [6 J0 d) L JavaScript是运行在客户端的脚本程序,用它可将文本输入 1 S% g# D1 \7 ]* F. o4 W6 f框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 - K3 M! ]) C" N0 G; z微减轻Web服务器的一点负担:

7 _4 g0 Y% X8 T, b$ P

1>读出Cookie:4 s: C' q5 Z0 `! ?9 D JavaScript中可通过document.cookie访问到所有Cookie:5 B; ?) \/ i9 ?: H1 k o- N "变量1=值1;变量2=值2;变量3=值3;"+ D) W: V0 \2 H6 k' D 需经过串分解就可得到每一个变量名及值;! V4 R: K4 h/ A( D% @4 ]7 o9 J 2>写Cookie: ( w- A# m, b, d* G8 o2 e* e2 d' q9 P email="bush@usa.com";+ n& e( S4 F3 k- h+ F firstname="jorge";6 e) s8 K! C& n5 k" E" I5 {% ~$ m lastname="bush";7 `% O S" k V6 p b1 T expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; - X9 k% [6 i$ \8 ^) L document.cookie="email="+email+";expires="+expireDate; 2 `( W! {' m+ V) J3 r$ k document.cookie="firstname="+firstname+";expires="+expireDate; 6 v) s. t& p5 u+ n* h& Z1 s* T* ] document.cookie="lastname="+lastname+";expires="+expireDate; 6 H/ x: M* t# ]5 a/ ^* a- | 下页一例,将网页的文本输入框域变量NAME自动保存下来:

; M: ]. i4 [* a% [& h( p

<script language="JavaScript"> 4 ^% e/ m2 Y: |<!-- 5 v/ ]5 l' U. L" `) A# P8 Zfunction getValue(s,n) // 分解Cookie表达式s $ G) {; {8 ?; Y9 P& ^ B{ 3 @0 c* r: T6 r1 ?6 q var pairs=s.split(";"); // 分解成串数组 - m# ^3 r w# R0 [ for (var i=0;i<pairs.length;i++) ( }4 O! n* S& `: }) N' S { ; u/ G% E& v/ Y8 E% V/ d var pairSplit=pairs.split("="); 7 _$ f0 x& G# x3 | if (pairSplit[0]==n) file://查找n" j+ S9 T, Z* F/ K% l return pairSplit[1]; file://取到n的值 * X4 b. ?$ b7 k* q } - \6 Q5 ?, I8 @' y" I8 ~ return "";% {# N5 L, J6 J+ h }4 L% i9 k7 c v function getName() file://取Cookie中的姓名NAME # q+ ?) n' {8 o L{ + q- `! @# l: C* L* h4 y var s=document.cookie; // 取所保存的Cookie 6 G1 o9 j( m) ~" o6 b2 P NAME0=getValue(s,"NAME"); 8 a7 Y/ |9 T+ ]& Y1 C form1.NAME.value=NAME0;$ Z& p% r# A3 @) h }& z- D5 R: k& @# g- `# c function newCookie() file://将Cookie中存姓名 " a! i* N* R1 w{ 0 Z. e. l1 A; i+ @. R9 J var s=form1.NAME.value;0 b. T* b7 ] e0 n `# [ if (s!="" && s!=NAME0) // 非空则保存 * {( T$ x B+ F+ m) o) t- t {: ^5 i+ Z) }. x, M/ |0 X$ a s="NAME="+s; + ^# U! @ n% A3 j* O9 m s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; , I: ]. h( p6 y- @ document.cookie=s; // 将保存到客户机中0 r$ j2 X6 t- b3 w+ O- g( \ } + G- z, }* s+ ^+ f8 E/ `/ w} . `# S+ ]1 E' e5 R; wfile://--></script>/ \0 |1 t2 _* x+ g; d2 l+ R ..................

6 B3 ?( N- e- w0 C

<body bgcolor="#00FFFF" onload="getName(); 8 J5 d1 w( k! s/ N form1.TEXT.focus()" onunload="newCookie()"> / W) B. j3 n) _3 l g# j<!进入本网页时将执行onload中的getName()>) i7 a! j/ E! ^! |5 ?1 ~) j2 B( O <!退出本网页时将执行onunload中的newCookie()> $ U! \+ |- Z3 m+ E% j# h: _..................

! P J% d0 {( t) j

三、BCB与Delphi中用ISAPI对Cookie的存取: * L8 l& e% e d, N/ j8 G [注:Delphi用 .代替BCB的->]

* i: p/ ~9 t/ _4 H$ y

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,. _) }2 J+ B1 B& @+ m 它也可以读取与存入Cookie变量:

, @1 r9 n9 L' u, W. |& o

假设处理用户提交的方法如下: 2 @9 H, I( O$ _6 u. ^ F void __fastcall TWebModule1::WebModule1Action(TObject *Sender, - ?6 C2 U z9 t* q' O/ Y8 UTWebRequest *Request, TWebResponse *Response, bool &Handled)

6 @" g# ^ \5 F( \/ s8 S" p' z* M, O

1>从客户机中读取Cookie: ( m! M, n2 |& i+ O/ z) b; }2 U Request->CookieFields是个串数组TStrings *,如果不为; Q- s) a+ T4 B, d5 [0 @6 I. ~* b5 a 空,每一行都将是如下形式:( ] [' j5 N5 z; s1 K7 I* E& ?2 K Cookie变量名=值3 r6 t7 u2 h# z 共有Request->CookieFields->Count个变量, 0 d' w7 V0 G# ~ B, ]: u# O变量名为Request->CookieFields->Names; (i>=0) 6 y/ B* K k- q7 N- R6 ?Reauest->CookieFields->Values["变量名"]就是对应的值;# m) r# g3 s& z: c% f; t* K; p 请注意: 客户首次访问网页时,客户机中并不存在你将要设的) N- |' Z# V( S' S Cookie变量,所以第一次Request->CookieFields将是空的;

O9 C- R- f9 M; S

2>将Cookie变量保存客户机中:2 a, C- j' V2 h8 g/ @% H; Q TCookie *pNewCookie = Response->Cookies->Add();9 O/ w5 e9 \9 \, P- X8 |" I) S5 G# U pNewCookie->Name="变量名1";4 |8 q0 ?$ ~1 H# V5 b, `2 x pNewCookie->Value="值1"; 2 L1 ?6 P7 c* \8 F pNewCookie->Expires = Now()+366; // 保存一年2 s( u& q4 \1 v t: J 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

. U, O5 F/ }+ i9 u) w: ]

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 7 r! J+ I9 p5 x% C' @' L, K; J.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

$ l( J. u! F0 r

void __fastcall TWebModule1::WebModule1WebActionItem1Action( 7 l7 Y' B0 p) N% k$ A TObject *Sender, TWebRequest *Request, TWebResponse *Response,2 R0 G: f$ q# U bool &Handled)/ I6 M9 m5 E B$ u { C! N+ M1 Z. E. _5 O# I TStrings *cookies=Request->CookieFields; . Q0 _- I; C# a; L3 Y String oldvalue1=cookies->Values["count1"]; // 取count1旧值8 }* R1 [! t9 G" n String oldvalue2=cookies->Values["count2"];

& _/ F; c; o. G: G

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 & y: k; e5 r7 q8 a String newvalue2=oldvalue2.ToIntDef(0)+100;

0 ]% c% }; M1 `6 R

TCookie *pNewCookie1 = Response->Cookies->Add();# ~$ f! m' G* n9 \5 J4 `: R4 ~ pNewCookie1->Name="count1"; file://更新Cookie! J1 x9 H/ M+ |& G3 D3 V! r# r pNewCookie1->Value=newvalue1; # d7 X/ k7 v/ ?& r) P p pNewCookie1->Expires = Now()+366; // 保存一年

7 {/ t3 d0 n1 c- C8 O# [# B

TCookie *pNewCookie2 = Response->Cookies->Add();% U) e7 s4 z8 J& E pNewCookie2->Name="count2"; file://更新Cookie & g& |% x1 r3 S. | pNewCookie2->Value=newvalue2;+ R' Z# G4 o& G4 n pNewCookie2->Expires = Now()+31; // 保存一月

, j% L) w" s5 u! l7 L$ N

// 向客户显示Cookie的值 $ _3 y: g! U, g: C' L String h0="<html><head></head><body>"; + N! e) O+ p; Q- U- w String h1="</body></html>";! \8 @* N: S) k4 f" l String s1="计数值1="+newvalue1+"<br>"; $ S3 w3 }4 E. I0 d String s2="计数值2="+newvalue2+"<br>";

. I' n. j/ C( o1 k

Response->Content=h0+s1+" <br>"+/ [9 g! m7 x+ E+ X s2+" <br>"+ h1; $ A% u8 T. I( X} + V; N' k3 [2 s) G1 Z

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

回顶部