QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

) J# R- f' r0 I) a6 z

一、 Cookie概述:

6 D% Q6 p$ M2 }3 f8 f' R# P: ~

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。 0 b- m- K5 y% p. | Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 . P0 P& { Z& X7 j+ n7 b, j) P内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可& l/ p( z3 a B' w. | 测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 ) j% K& |, K5 q; b7 g" M的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次 1 k, C& U3 P& {, P- q所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网3 X- ?, e+ J S/ o 页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 1 |5 ^# u1 C- S7 H: _小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户, 9 Y; R, e- ]2 Z9 a9 @9 }使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

. S2 ]3 E- D( R7 b

二、JavaScript脚本对Cookie变量的存取:. T, E8 |& n6 W& R8 C JavaScript是运行在客户端的脚本程序,用它可将文本输入: U, V4 _5 O( F) ^3 S) ` 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍 7 y; z) n; J* B" F ~8 F微减轻Web服务器的一点负担:

' a0 g' m7 p3 D, ?" m5 i

1>读出Cookie: ! ]6 v8 F' T6 X JavaScript中可通过document.cookie访问到所有Cookie: " J. d) a; l. q$ T% K( ` "变量1=值1;变量2=值2;变量3=值3;" # q* `! e( M7 N 需经过串分解就可得到每一个变量名及值;9 i/ l$ U* b" m# n 2>写Cookie: ; D0 \9 H$ P, g; | email="bush@usa.com";/ F& o) _0 c9 _. K3 ] firstname="jorge"; & ^; {" l4 t; h4 f lastname="bush";9 m4 j& f# y: {5 ?* R, { R expireDate="Thursday,01-Jan-2099 12:00:00 GMT";1 ]; x# d: h( t2 W document.cookie="email="+email+";expires="+expireDate;. b* E3 s% `9 X2 v3 k% `$ w document.cookie="firstname="+firstname+";expires="+expireDate;+ k Z3 W$ t* M# ]8 M2 { document.cookie="lastname="+lastname+";expires="+expireDate; ' V# Z/ L5 E% q: D' `. o8 ? 下页一例,将网页的文本输入框域变量NAME自动保存下来:

0 ^5 s7 K- o( Q

<script language="JavaScript"> : K* L, e2 n) ]6 X a<!--. M5 Q2 K; I5 B; u) v# w9 e- T function getValue(s,n) // 分解Cookie表达式s1 E- j" x1 _9 V& k Y. h {) J9 F6 p# {2 f) h3 d D6 w var pairs=s.split(";"); // 分解成串数组 # @* S3 {+ n7 \. `$ C. A for (var i=0;i<pairs.length;i++) / B) H$ @; T5 _( @ { ; ?& r3 x; Q' B. }# z. D2 y var pairSplit=pairs.split("=");% U6 v4 ~* e0 L% e6 p' h1 s1 h e8 z if (pairSplit[0]==n) file://查找n 1 V+ q' U! P' T" `: q; Z return pairSplit[1]; file://取到n的值 z& b+ {1 y4 I! y2 [# Z1 ^' | } x' c/ ]( v- n1 c! S3 }3 m5 i4 R return "";7 U+ i: N' P. L3 D% I }( d$ F3 L: X" h& } function getName() file://取Cookie中的姓名NAME ! Y6 |* L3 b- M{& J4 s! U2 a! M; N7 K& x. } var s=document.cookie; // 取所保存的Cookie9 L6 B; b2 [) X7 h NAME0=getValue(s,"NAME");- u+ O; V# v5 |2 w0 u form1.NAME.value=NAME0; 9 {+ R/ E. N `! A} ; |5 o4 L4 U: B" n' bfunction newCookie() file://将Cookie中存姓名 & x1 G; Y2 F6 ]% D{ 1 o$ L2 E3 \" P- B" s- g var s=form1.NAME.value; / G+ b4 ?3 X. W- e if (s!="" && s!=NAME0) // 非空则保存/ m1 N2 k' u$ t6 d$ _ { 8 e* u% i6 v/ G. b' l' B s="NAME="+s; 3 K% {/ x$ p! Z! O) Y! S s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";+ U) L9 X- g" e1 K& t m% x- p document.cookie=s; // 将保存到客户机中 & \ h2 c- M9 ?5 [* J. ?5 \ } ; t2 c( z* ~2 v} 1 t$ v% |& n! Cfile://--></script> " X2 B# V ?* X4 P/ X9 C..................

3 Q$ g- S8 h/ h1 H- ?. c2 W3 B

<body bgcolor="#00FFFF" onload="getName(); p9 Z5 a$ J/ u2 F# G form1.TEXT.focus()" onunload="newCookie()">9 V# N4 \& M1 i! o$ | <!进入本网页时将执行onload中的getName()>$ l* W0 Q8 y' `2 i <!退出本网页时将执行onunload中的newCookie()>) o+ a- I' g# R ..................

" C- I/ d" U* Y* V4 T

三、BCB与Delphi中用ISAPI对Cookie的存取:/ N k% L" C7 Y) X# C! _1 [* N [注:Delphi用 .代替BCB的->]

# g6 }/ z3 m; N1 u

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, " L$ z S% f- I, Z# O. a& @" @6 M它也可以读取与存入Cookie变量:

: E- L# g0 s/ | ^

假设处理用户提交的方法如下: 8 |5 ^) ^( P' b. t. U9 A6 x. _ A9 a void __fastcall TWebModule1::WebModule1Action(TObject *Sender, V: @: V$ l; j; dTWebRequest *Request, TWebResponse *Response, bool &Handled)

7 q Q7 Z$ K4 S$ `8 r

1>从客户机中读取Cookie: 2 h& B4 l6 L0 }! ?8 [* G Request->CookieFields是个串数组TStrings *,如果不为4 {3 j' E1 j8 V! G! O7 P 空,每一行都将是如下形式: - d4 e: Z' U; c& D- N1 Y+ @ Cookie变量名=值$ y, @+ Z" M; M, ~ 共有Request->CookieFields->Count个变量, % e: y7 o5 z2 b- q6 I变量名为Request->CookieFields->Names; (i>=0) ! x9 O# k. }5 a: G0 WReauest->CookieFields->Values["变量名"]就是对应的值;. q% l8 l1 h+ ~" @ 请注意: 客户首次访问网页时,客户机中并不存在你将要设的 P7 M' U+ {6 p/ R6 B$ Q+ Y' B Cookie变量,所以第一次Request->CookieFields将是空的;

' `5 i: M' J. w

2>将Cookie变量保存客户机中:9 H/ s% v+ W" K' v! Z TCookie *pNewCookie = Response->Cookies->Add();6 I6 x+ H. e, h; e8 m pNewCookie->Name="变量名1"; / {1 `1 U- P1 j/ F5 y+ H0 n% _ pNewCookie->Value="值1";1 h" t& V) T& m% A9 M, m9 P/ F pNewCookie->Expires = Now()+366; // 保存一年1 V* \$ q8 r7 L0 T( C( d 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

# f# x7 Y4 e# M6 c2 c

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 6 M. Q' [* T' k. W; c" F.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

! @# w# s- h- v& K9 c

void __fastcall TWebModule1::WebModule1WebActionItem1Action(* ], f/ F) B v: X7 b6 O+ Y TObject *Sender, TWebRequest *Request, TWebResponse *Response, " E2 ?% X7 N2 {7 `0 ]$ |' @ bool &Handled) * U- ^/ E) X+ \4 o4 J# V y{ ( z# ~' U4 u6 G# d7 z5 n TStrings *cookies=Request->CookieFields; & [# S# d# N) V String oldvalue1=cookies->Values["count1"]; // 取count1旧值( B7 \# X+ T. }' q String oldvalue2=cookies->Values["count2"];

, r3 z( |+ d; Y9 V

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值2 {, l6 w0 R: _' N String newvalue2=oldvalue2.ToIntDef(0)+100;

0 `; P, B/ x6 t c0 S* z0 X

TCookie *pNewCookie1 = Response->Cookies->Add();- R- g: h9 X. K! g, P- Z pNewCookie1->Name="count1"; file://更新Cookie 2 t- E, R# Y7 i. p( ?8 t pNewCookie1->Value=newvalue1;( v z7 x0 W0 l0 k& s) \2 n pNewCookie1->Expires = Now()+366; // 保存一年

' z; j. ~- o9 H! `

TCookie *pNewCookie2 = Response->Cookies->Add();& w, \; J3 v* I. u5 _! z pNewCookie2->Name="count2"; file://更新Cookie 6 x$ I2 k6 x4 p0 ?$ @! L2 }) e# L pNewCookie2->Value=newvalue2; # ^) i; Q8 V0 _ pNewCookie2->Expires = Now()+31; // 保存一月

" [, N/ j3 v3 t0 K/ T

// 向客户显示Cookie的值3 v6 X& d9 Z) _" {& O8 L6 ^ String h0="<html><head></head><body>"; ! \# _6 ~' _8 R8 |: A6 Q, }2 J( x String h1="</body></html>"; / T1 N: w; N# S9 B1 \7 R String s1="计数值1="+newvalue1+"<br>"; 1 c% x$ }3 e" P$ O8 D String s2="计数值2="+newvalue2+"<br>";

- b, e! z6 a6 I5 w/ d

Response->Content=h0+s1+" <br>"+7 m& u; m9 _8 i/ h s2+" <br>"+ h1; ! d2 e, e1 j! C7 _8 V} 6 P+ t/ c# A1 ^, z7 N% v5 U1 J

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 21:08 , Processed in 0.328784 second(s), 52 queries .

回顶部