QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

3 H9 N! y# _- j' f) }" r) B1 c

一、 Cookie概述:

1 u2 R$ n: }# E

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。! d1 O) L0 T! i$ t Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机* @% Z' Z! ~- T7 C* v( { 内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可0 n' j1 A# T4 s; l8 T 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 ! J9 S( v4 z" ?3 u的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次% h. F. a5 ?/ x$ h8 L 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网8 l! @% Z, r6 o" |, m 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫2 \* y- Q$ ^$ G 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,' R0 y" _& b$ k9 P" g8 N5 A% q 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

9 u' s6 I! g( @/ Y: I" o7 k6 J

二、JavaScript脚本对Cookie变量的存取:/ }. K! J k1 r& V) a JavaScript是运行在客户端的脚本程序,用它可将文本输入1 @4 ?" M7 a8 `5 b7 q( \ 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍# {7 s8 \+ q3 I+ x) G/ _ 微减轻Web服务器的一点负担:

* ~- Q/ {6 O7 i0 d+ c

1>读出Cookie: 3 w4 d9 `* q) P+ l" S JavaScript中可通过document.cookie访问到所有Cookie:* ?. U) R% I2 ~3 f1 F/ T' ? "变量1=值1;变量2=值2;变量3=值3;" , Y) n3 t8 s. a4 e' N 需经过串分解就可得到每一个变量名及值; , Y) J( g! {) G! ^8 H* }& @ 2>写Cookie: : w% R3 A$ c. y% v/ ~% L" p email="bush@usa.com";! \1 |$ J+ X$ x! o7 t firstname="jorge";6 b& p M/ t! F% | lastname="bush";8 V; y t9 t6 e1 X( e9 q+ W, w k expireDate="Thursday,01-Jan-2099 12:00:00 GMT";: d2 U R! L& W4 ^ document.cookie="email="+email+";expires="+expireDate; ! p# k/ J- I5 L/ \1 t( x document.cookie="firstname="+firstname+";expires="+expireDate;5 y& M& [5 n& s. J/ ?* A' o document.cookie="lastname="+lastname+";expires="+expireDate; ' A4 e/ n6 \. F* g$ F 下页一例,将网页的文本输入框域变量NAME自动保存下来:

7 j( V& e6 ^4 C7 G3 D1 k& a4 [

<script language="JavaScript"> ; i% Y( V" q/ T* q# q5 l, w9 E S<!-- 5 o$ S0 i& E! P d$ qfunction getValue(s,n) // 分解Cookie表达式s, L7 }% a4 M. Q }" b { - E( a! k6 U/ k, q9 i* j0 a9 U+ t var pairs=s.split(";"); // 分解成串数组 * f$ B2 w) V! I4 L. M! c- b for (var i=0;i<pairs.length;i++)' U2 \! i. N5 o$ u. E) d { ' `3 X$ u& ?3 i var pairSplit=pairs.split("="); 8 |7 `3 W; Q- U9 X+ W5 d0 E if (pairSplit[0]==n) file://查找n 3 a0 I5 @6 p, N9 @# {5 e1 L return pairSplit[1]; file://取到n的值 n& L# x& m' G5 v2 \2 o } ' h3 _+ L8 l$ e: g7 w* a/ A return "";: c1 c0 t$ C3 D) G% h+ k3 A }, m- D, D c" k5 h; F# n) Y function getName() file://取Cookie中的姓名NAME , y4 w" W1 ?! D% Z: l& {{1 {! f- ^6 c$ A; w' w: N var s=document.cookie; // 取所保存的Cookie- u# R d4 P! L8 e$ b NAME0=getValue(s,"NAME");" Y. f3 {( {8 ? form1.NAME.value=NAME0; * [0 {8 d6 a r; W}6 H, L9 A" v" I function newCookie() file://将Cookie中存姓名8 U9 z. O, i& G- J( x { R$ Y7 C+ ^, s0 m. s! Z var s=form1.NAME.value; 2 T& |$ W6 k8 l6 |! { if (s!="" && s!=NAME0) // 非空则保存 - I0 U- S# ]) H1 I( a. v {5 @7 f6 D6 N! N7 U0 \) I s="NAME="+s; , C0 H8 [$ o: c) s1 E! i) V s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";0 d( g6 e' K; r2 I document.cookie=s; // 将保存到客户机中4 {5 V+ W; Y2 j6 [+ c' b' T } 5 F; D+ R/ n1 G! g g } - }; A( | q; p6 t6 p5 |- kfile://--></script> 1 g& m+ f; \9 {6 Q..................

9 e" O' y" Y9 d) V8 e6 P G

<body bgcolor="#00FFFF" onload="getName();0 j; z H& u8 F3 q! c; U, s1 L form1.TEXT.focus()" onunload="newCookie()"> ) D- [' I! p) I$ N. Q<!进入本网页时将执行onload中的getName()> / u! C# t& F* M- ~# `% @2 ^<!退出本网页时将执行onunload中的newCookie()> 0 n+ Y' E( Z* Q7 N3 j% p: I..................

/ ^) a- l! ^3 G% F( {3 F

三、BCB与Delphi中用ISAPI对Cookie的存取: 2 D3 c) `: U6 }: p, I& R [注:Delphi用 .代替BCB的->]

7 c5 a! o: ]# `/ u0 b; C

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, & f! q( D2 f5 Y: s3 c; k8 [3 U它也可以读取与存入Cookie变量:

* H; f' Q: s) e' E3 C* a, `

假设处理用户提交的方法如下: + l' l$ S1 Q% Q+ Q" j void __fastcall TWebModule1::WebModule1Action(TObject *Sender, " I& p" B& r+ J, R2 M9 w: C4 hTWebRequest *Request, TWebResponse *Response, bool &Handled)

' `5 Y: J0 i, W+ [2 F0 `

1>从客户机中读取Cookie: 5 U `* }! V" ~7 b5 ]! v* v Request->CookieFields是个串数组TStrings *,如果不为% Z5 e, g, K. w* P 空,每一行都将是如下形式: ; Y0 Z2 }# F l: n; g3 e$ D: e Cookie变量名=值 " x/ G- } p9 x8 g共有Request->CookieFields->Count个变量," l5 \% R+ L. b* z* o 变量名为Request->CookieFields->Names; (i>=0) v& z7 M' R% z& z0 g! E. iReauest->CookieFields->Values["变量名"]就是对应的值; # L1 Y% c D4 U) w请注意: 客户首次访问网页时,客户机中并不存在你将要设的 7 F3 g( Z# H- Q2 D) K$ H5 k% @: jCookie变量,所以第一次Request->CookieFields将是空的;

5 F# B! Z9 u' k" I) C1 z

2>将Cookie变量保存客户机中: 8 P8 | P8 v2 ^# C& K# i TCookie *pNewCookie = Response->Cookies->Add();7 ?& v6 g+ \! m( F' m8 l% O pNewCookie->Name="变量名1"; # L$ w- N% ~, o* p/ k pNewCookie->Value="值1"; 7 d* K, V) q7 q pNewCookie->Expires = Now()+366; // 保存一年 + z2 w8 u9 u: L就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

- d5 W# t+ Q& f9 N' D

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 % Y' e4 k/ E0 p7 w.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

; e/ \' K+ E0 C- b5 ^. Z0 e

void __fastcall TWebModule1::WebModule1WebActionItem1Action(* k. z4 ^9 \ m; w" }# q TObject *Sender, TWebRequest *Request, TWebResponse *Response,& t# F: K; Y: C bool &Handled) # f& f7 i- q/ X3 x/ X. }! U{) T8 ?0 Z' Y4 [+ A, ^ TStrings *cookies=Request->CookieFields;7 W0 C% t$ B; k$ n String oldvalue1=cookies->Values["count1"]; // 取count1旧值* \ `* Z0 `! J3 k' [: X String oldvalue2=cookies->Values["count2"];

* Z/ b# a9 c5 K

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值! G4 q) \' |, H. |- [+ | String newvalue2=oldvalue2.ToIntDef(0)+100;

# p; ~) w" ?# k2 w

TCookie *pNewCookie1 = Response->Cookies->Add();$ S% `" M6 I! y7 Q0 B1 _ pNewCookie1->Name="count1"; file://更新Cookie$ w$ t8 E1 @6 C9 w3 P9 Q0 E; K pNewCookie1->Value=newvalue1; " t6 o. P1 W! w1 M pNewCookie1->Expires = Now()+366; // 保存一年

- o, D/ O- l/ y* J/ i1 ` t

TCookie *pNewCookie2 = Response->Cookies->Add();; _' t2 k+ Y7 L2 ^ pNewCookie2->Name="count2"; file://更新Cookie / Y- E3 ^2 c4 [ P0 A# r# ? pNewCookie2->Value=newvalue2; \) Q) o/ c) Z( V# ~8 H pNewCookie2->Expires = Now()+31; // 保存一月

/ k1 ?' a3 A) ]( Z1 h1 \

// 向客户显示Cookie的值! F- c @" @2 @' Q+ t/ L* f+ f5 t String h0="<html><head></head><body>"; 7 b6 \0 Z+ w# \; p% [: b2 H String h1="</body></html>"; ; v& F: F- J$ }0 ]/ K String s1="计数值1="+newvalue1+"<br>";3 X& x( u; k; K) _4 L$ W+ M String s2="计数值2="+newvalue2+"<br>";

/ ^$ u. j4 I3 @" N- E

Response->Content=h0+s1+" <br>"+ ' J @. [8 |. H s2+" <br>"+ h1; 9 `! }0 m* x1 k} 0 z* ^/ }: ]- p" d4 x% Q

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-10 22:20 , Processed in 0.392699 second(s), 51 queries .

回顶部