QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

3 a9 h! n: b7 h: ?1 L" l! W

一、 Cookie概述:

2 q2 i) V- r2 L6 h; L

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。4 ?9 P) {: b+ V; |/ k2 r9 `) o' k: S Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机, `. H" E; {0 } 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可5 ]/ u) K! ]6 x5 ? 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 9 v) c D3 L* H% T# }的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次& O, Z/ X$ C+ H& z3 m 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 . [3 h5 p H4 @4 R- W( i9 [. k页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫! z& N- N; z# r% Z) W( ? Q1 t 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, * Y# H3 A( b4 U' I* a. I使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

/ G' C, y" k8 J/ {/ t

二、JavaScript脚本对Cookie变量的存取: & P7 F# X6 K5 \; | JavaScript是运行在客户端的脚本程序,用它可将文本输入: F; ?6 ~9 S$ e 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍- W% R$ o: {/ U. L 微减轻Web服务器的一点负担:

0 r' T2 k2 {# q5 e. P

1>读出Cookie: 7 k2 s$ ]) [% m5 r JavaScript中可通过document.cookie访问到所有Cookie:$ @2 m+ H: y* c, \ "变量1=值1;变量2=值2;变量3=值3;" { f+ S3 m' x$ n0 ?* z1 ~" s2 y 需经过串分解就可得到每一个变量名及值;2 L% Z+ u/ ]& W* a 2>写Cookie: : u! I" m- \) x, e3 \ J" y email="bush@usa.com";" z; ~9 _$ @. e( ]3 [ firstname="jorge"; , l$ O3 n0 w9 q( n) S& w; @8 q lastname="bush"; 8 n, A$ ]2 Y/ q- P" k+ j! s expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; & I0 }: f# M% S document.cookie="email="+email+";expires="+expireDate; 7 j" h p- U, {' Z- ]- A# f document.cookie="firstname="+firstname+";expires="+expireDate;0 c8 W, v9 ]) |& G' W) q7 {* f document.cookie="lastname="+lastname+";expires="+expireDate; , G7 R P. G3 [, l$ h3 _# c' y 下页一例,将网页的文本输入框域变量NAME自动保存下来:

; a& Q8 _* g& \* B- }( i0 V

<script language="JavaScript">4 Z) Y: ?4 N( D+ d) a- G* y <!-- 3 ~- W& n# u8 E1 _& I# `function getValue(s,n) // 分解Cookie表达式s ; z: E3 k( b! h{0 [- |# j3 c, [# @ var pairs=s.split(";"); // 分解成串数组" _) \0 p" S0 V# }0 I for (var i=0;i<pairs.length;i++) v$ `9 d+ H4 s6 p {7 Q. g7 ]) g% e' T0 Y, L! x var pairSplit=pairs.split("="); 9 ]+ R/ u% V. F D5 g8 S4 X if (pairSplit[0]==n) file://查找n 3 B0 A" j7 W. c% x( ? return pairSplit[1]; file://取到n的值8 J+ P. b3 V/ m, E } 7 Y3 C0 t7 Y$ F! { return ""; ) h) u' p) ~2 Q- M) F) g/ s}, w/ m4 k/ a: X( [# }# u v function getName() file://取Cookie中的姓名NAME: [; I* M" }( V6 o9 z { I5 ]) {( t. t- K% e var s=document.cookie; // 取所保存的Cookie1 F& W6 ^* {6 x4 _- p NAME0=getValue(s,"NAME");( P) u% I5 c/ D8 P Q1 }) a/ [$ d J6 [ form1.NAME.value=NAME0;! D) N2 b) F& }; d } q/ {5 a- H% C% b+ J5 N# \' ?: ? function newCookie() file://将Cookie中存姓名1 |3 X7 }! H* O4 Q$ d: h# m( b {- m- X# u$ ^3 g0 U# V; e9 L var s=form1.NAME.value; - t% d/ I1 j* u6 r) r if (s!="" && s!=NAME0) // 非空则保存0 B6 N3 U: j" ]" a' d, p3 @% L {9 S$ n8 U/ X4 b. ]9 Q# p s="NAME="+s;! t( [* R- Z! Y& B% Q+ R s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";. B9 b, y8 P1 z {; Q document.cookie=s; // 将保存到客户机中9 @3 R: T* I5 u; ~ X( X O4 P } 3 f# V0 m6 L8 N, p, _6 W+ K} 1 }+ D# ~9 v0 b. }file://--></script> ; x& }6 W$ s) O. [) f, S, `..................

" ~4 C$ ?3 ~/ f" i5 y

<body bgcolor="#00FFFF" onload="getName(); * `1 Z2 H+ O2 H& A) K: o form1.TEXT.focus()" onunload="newCookie()">' v5 E4 f% U: j g' l8 q3 `- } <!进入本网页时将执行onload中的getName()> " t- T. B& K/ D. Q<!退出本网页时将执行onunload中的newCookie()>8 k4 a& i% s, X$ x2 x ..................

, @3 @( l9 |, e. v$ Z

三、BCB与Delphi中用ISAPI对Cookie的存取: ! V* c' Z! l5 P! Y8 Y7 V [注:Delphi用 .代替BCB的->]

* Q. M" P! r* U

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, 8 r6 y3 c/ h5 \6 Q它也可以读取与存入Cookie变量:

9 L5 n8 J- S/ J1 t% B

假设处理用户提交的方法如下: - C3 A3 L$ T. n! h" d7 C5 j void __fastcall TWebModule1::WebModule1Action(TObject *Sender, : E) {& o1 C( h+ ^0 ?0 F& s/ vTWebRequest *Request, TWebResponse *Response, bool &Handled)

; |2 w0 T- t4 z; L6 z1 ^ y0 e

1>从客户机中读取Cookie: : c6 W" q# P! }9 M: W Request->CookieFields是个串数组TStrings *,如果不为6 Z8 L! n* g4 I8 Q; d 空,每一行都将是如下形式: ! S& a1 ]9 h9 M; W8 Z Cookie变量名=值: Q( ]. c! `, ~ w- i 共有Request->CookieFields->Count个变量,* g( S9 S7 [$ d# k 变量名为Request->CookieFields->Names; (i>=0) P( }2 O9 n9 M$ t$ V+ LReauest->CookieFields->Values["变量名"]就是对应的值; 6 z3 |) ^. V7 [! c8 a' q+ M7 z& K请注意: 客户首次访问网页时,客户机中并不存在你将要设的' f% Y A5 Y: P# u% {! f# ? Cookie变量,所以第一次Request->CookieFields将是空的;

% M, d" y+ d$ h

2>将Cookie变量保存客户机中:% i, V7 ^3 e, I9 v- I5 l' K TCookie *pNewCookie = Response->Cookies->Add(); 8 W) w* a7 u/ `/ J# A' ? pNewCookie->Name="变量名1"; $ I) L& l5 z4 ^4 o0 c" ~ pNewCookie->Value="值1"; ) c& ^5 f* M" p" d6 B6 H pNewCookie->Expires = Now()+366; // 保存一年 0 B# K, w$ S% D6 L% l7 `1 N就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

5 K/ [, y; J9 g# d+ y3 \5 k- \

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 % \, I# p& T. v6 Q3 e {9 u.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

; n' R8 A/ m# I7 D- Q5 O5 E; N& C

void __fastcall TWebModule1::WebModule1WebActionItem1Action( " L' L' O) P7 j$ y7 o TObject *Sender, TWebRequest *Request, TWebResponse *Response,. x/ _" a# Q0 ]% s: p5 K bool &Handled) 6 u* k. C9 a/ R( h, f) L{$ v" Q g, X; \% e6 p9 M8 W; B0 Y TStrings *cookies=Request->CookieFields; R8 V; n+ J1 k# D& j String oldvalue1=cookies->Values["count1"]; // 取count1旧值) N1 h! f0 |% v) E3 ^ j# `7 Y String oldvalue2=cookies->Values["count2"];

$ r8 y3 D9 v7 D) d

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值; M9 B, J1 _- n5 F String newvalue2=oldvalue2.ToIntDef(0)+100;

- D! S/ D" a7 @( ^% b

TCookie *pNewCookie1 = Response->Cookies->Add(); ; C% s, c8 o* k! G' _9 q pNewCookie1->Name="count1"; file://更新Cookie + e$ d. f( L! w+ s$ t, z- i6 ?5 @ w pNewCookie1->Value=newvalue1;/ G2 Q- F' S; O, e pNewCookie1->Expires = Now()+366; // 保存一年

7 C' m7 w7 X( S E/ i

TCookie *pNewCookie2 = Response->Cookies->Add();. y2 I |" W* Z; V/ z, B pNewCookie2->Name="count2"; file://更新Cookie 5 h$ S! ?! M; J+ D0 u6 | pNewCookie2->Value=newvalue2; 1 b* K$ k0 y6 E5 w0 ` pNewCookie2->Expires = Now()+31; // 保存一月

9 v: B: M* P% E1 ]$ Y+ ^( s

// 向客户显示Cookie的值 * V _4 L% G. {2 b' o: ? String h0="<html><head></head><body>"; ' c$ j& G8 A* I0 _ String h1="</body></html>";4 \2 U5 l: F* }4 J- N' r; H4 |& o* S String s1="计数值1="+newvalue1+"<br>"; 3 v( L4 H( w6 N# _! U: u2 m" Z String s2="计数值2="+newvalue2+"<br>";

" K) r7 E( |7 j; i" _

Response->Content=h0+s1+" <br>"+ 7 c* {/ D) c% D5 Y- Z* R s2+" <br>"+ h1;1 b5 x$ a" B( v" B/ ~) [# ~ } / w& Y2 z* N z8 ?# [7 s

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 19:01 , Processed in 0.380850 second(s), 52 queries .

回顶部