QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州BCB]

1 y' f$ t6 j1 _2 w

一、 Cookie概述:

2 j* l' U& Z, A# f/ I

要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。7 I) ]3 F& |9 x+ y Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机 ) [% X! r" H+ z; s内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可 + u5 m0 A1 i) R, J# b/ q" s% u8 M! p测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量 3 x) z5 a, [& n4 o) ?的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次5 U+ i" \1 V/ @& B& D& \( Z% r 所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网 7 v% G H+ N$ g8 W$ z( f4 t% `页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫 z$ o/ r2 t. V8 @% m/ T W) n 小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,$ i9 x' w# _1 ? @" T 使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;

1 k9 ^, U& Z" u/ @$ o

二、JavaScript脚本对Cookie变量的存取: 6 @; t$ f. Q- F' Z JavaScript是运行在客户端的脚本程序,用它可将文本输入) A* y5 \% H9 P' F 框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍+ I) j3 a/ u) E' Y: C 微减轻Web服务器的一点负担:

% q% U. b: v- Z$ F' s

1>读出Cookie: ' i" h& C! i8 x+ N7 J" _ JavaScript中可通过document.cookie访问到所有Cookie:) }( T/ t) s4 M "变量1=值1;变量2=值2;变量3=值3;"; @4 p2 U6 `0 l* f2 c 需经过串分解就可得到每一个变量名及值; " E" _; _# x$ J' M/ d 2>写Cookie:1 v# m) D& d% P: y0 D8 p email="bush@usa.com"; $ v4 k/ Q1 z) s7 w; l: v/ B firstname="jorge"; / C- |; P/ l; H0 x% E' C6 N lastname="bush"; ( N; K% C5 H( ^4 t! [1 M expireDate="Thursday,01-Jan-2099 12:00:00 GMT"; ( z0 h6 @( l. Y0 U document.cookie="email="+email+";expires="+expireDate; ) D: ?" |' y; T document.cookie="firstname="+firstname+";expires="+expireDate; & U6 {/ Q9 P, Q7 a+ D, i2 z document.cookie="lastname="+lastname+";expires="+expireDate; - }/ u* L& i r7 B" [ 下页一例,将网页的文本输入框域变量NAME自动保存下来:

' k r$ j- w: `

<script language="JavaScript">1 r9 }7 f8 r( Y# G) w <!-- 3 m. R& q5 j, i; g/ y U+ ifunction getValue(s,n) // 分解Cookie表达式s8 U) z6 F, E. M {2 M6 e. l2 \7 W" o' @; \- ^ var pairs=s.split(";"); // 分解成串数组 2 L" S1 J# l+ [2 D I for (var i=0;i<pairs.length;i++) ' e" o8 ?( }. ]6 _2 m {# S8 X1 d# |4 g3 ]/ e1 q% w* v var pairSplit=pairs.split("="); 7 U5 l% d0 j% M% y if (pairSplit[0]==n) file://查找n0 |5 l& j6 _5 ~ return pairSplit[1]; file://取到n的值 ; ? D5 F6 ]+ v2 B0 ^+ n } " C: S2 i$ V' B; t/ o return ""; - |* K$ ?8 O( y' o6 h} , ^ X/ [2 b) v* C; X- efunction getName() file://取Cookie中的姓名NAME. Q" i( H- q$ k: O. l/ x! _ { " A# N3 t+ ^4 f1 X2 R var s=document.cookie; // 取所保存的Cookie / a% @1 {) d e2 ?+ a2 U3 A& ` NAME0=getValue(s,"NAME"); ! ?0 l. S' y3 x" F4 a5 ]/ j3 y4 d form1.NAME.value=NAME0;9 Z3 E0 x- x* {) `, ^9 C }/ x4 c. k$ R6 S function newCookie() file://将Cookie中存姓名 8 {/ h; N. E* V; f, z{ % i' y/ t9 B6 R/ R. u1 D7 O3 U var s=form1.NAME.value;7 v0 T) a. e: e+ R. t if (s!="" && s!=NAME0) // 非空则保存( c n ?2 K$ i+ c. v. H {5 k* {) q& J8 n5 K2 Q( A s="NAME="+s; . W* m1 P" ^* y) b9 R( ] s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT"; $ m B( T2 O$ [$ m6 F- k document.cookie=s; // 将保存到客户机中 0 r8 ~0 H1 Z w } W" S' S6 G* \1 d8 \ } ' q( b) N* f9 ?9 r S5 Afile://--></script> ' ^+ {; W1 D4 R# R3 e/ q0 s* D& z4 G..................

/ `; `! P. d: y

<body bgcolor="#00FFFF" onload="getName(); ) b$ b' e5 q4 z9 h( } p form1.TEXT.focus()" onunload="newCookie()"> 3 z1 \1 Y! J7 I; L' I. U9 G<!进入本网页时将执行onload中的getName()> ) [" j4 o( }- N4 a, s e# \<!退出本网页时将执行onunload中的newCookie()>/ x6 G2 {2 A$ a+ ?8 L, l# w$ V ..................

" S* _2 a4 ~# ?6 q2 a) b9 J" V

三、BCB与Delphi中用ISAPI对Cookie的存取: 6 D5 c3 x2 e8 s; k( ? [注:Delphi用 .代替BCB的->]

# p2 M. r$ N4 _% x

与JavaScript不同的是,ISAPI是运行在Web服务器端的程序, + c3 S; f0 _5 }. h' h它也可以读取与存入Cookie变量:

4 z& V: X4 L; F9 C% Q. _. X3 `

假设处理用户提交的方法如下: # R" K- a$ e" E- i. E1 p void __fastcall TWebModule1::WebModule1Action(TObject *Sender, # \! k6 I# h4 x) l$ ^TWebRequest *Request, TWebResponse *Response, bool &Handled)

2 W$ ` x) S+ Z- ^8 U# _* u9 C

1>从客户机中读取Cookie: " f7 R! z/ H% [ X/ E$ _7 e Request->CookieFields是个串数组TStrings *,如果不为 - r1 F+ w4 @8 Q( m+ u空,每一行都将是如下形式: 7 A2 b E1 D. m. N% L Cookie变量名=值5 g6 I2 c2 I- D( m( c, v) L% N& E 共有Request->CookieFields->Count个变量, . D$ H2 k c7 [4 U% p( D4 l9 y变量名为Request->CookieFields->Names; (i>=0) ; `, A e' y( HReauest->CookieFields->Values["变量名"]就是对应的值; ) w- K8 e8 q# R1 F6 W请注意: 客户首次访问网页时,客户机中并不存在你将要设的 5 v; j5 h. F2 Y( QCookie变量,所以第一次Request->CookieFields将是空的;

! A3 I& \$ F) b

2>将Cookie变量保存客户机中:5 G8 |0 p$ i& z0 @% J( ? TCookie *pNewCookie = Response->Cookies->Add(); 5 @$ o' |7 J" i' Q- [1 t' A* V, J pNewCookie->Name="变量名1";5 W% d' @* Q4 R. H pNewCookie->Value="值1"; ; H& [7 H& d, `1 y! @) r$ ^9 e pNewCookie->Expires = Now()+366; // 保存一年: Q" A1 T& d' g( z 就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;

# v4 X1 u( i7 \5 x7 U# V1 m

举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交 6 p% {) l# O9 j- p! o.DLL后,每刷新一次浏览器,将看到计数值将变化一次:

5 a# A9 d5 ]4 d4 L

void __fastcall TWebModule1::WebModule1WebActionItem1Action( ! V( N1 X& q! j$ k9 k( P# D TObject *Sender, TWebRequest *Request, TWebResponse *Response, a. \ K1 C1 M u% I/ r' [2 H% o bool &Handled) ( r9 Y9 O/ X* V' ~( @4 k- Z' b$ R$ G9 T{/ K* P* n* Q. D1 H, V: ? TStrings *cookies=Request->CookieFields; $ o7 _2 N i, j! m+ B* U) a5 _ String oldvalue1=cookies->Values["count1"]; // 取count1旧值" k3 l! D6 l* q4 x String oldvalue2=cookies->Values["count2"];

( A# B2 Z1 Y, B0 \4 k

String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值 - P0 m9 t! K( C/ O String newvalue2=oldvalue2.ToIntDef(0)+100;

9 d% O; p5 J1 Y2 e* }. O3 p

TCookie *pNewCookie1 = Response->Cookies->Add();% a$ e0 h5 E5 \. e: r pNewCookie1->Name="count1"; file://更新Cookie8 r% C( `8 j+ k9 k8 h( {2 O R( C pNewCookie1->Value=newvalue1; 5 U' g2 e' @2 p4 M" Y pNewCookie1->Expires = Now()+366; // 保存一年

: \8 r* t# ^/ B- Y6 y9 _7 T: t

TCookie *pNewCookie2 = Response->Cookies->Add(); ' I0 g: X. `: l0 I9 _+ u' w pNewCookie2->Name="count2"; file://更新Cookie b$ r1 T4 U0 ] pNewCookie2->Value=newvalue2; O( f( B! q* m- J( k% _% J pNewCookie2->Expires = Now()+31; // 保存一月

9 J8 k( G2 n, B! u4 b

// 向客户显示Cookie的值/ S, o; b; l+ W8 E$ k5 x$ }3 ]; b String h0="<html><head></head><body>"; " R% s- a7 ^0 v, _7 _ O String h1="</body></html>";; t6 {5 {2 d0 }0 g String s1="计数值1="+newvalue1+"<br>"; 0 |0 b! V3 Y# c9 M' C' g String s2="计数值2="+newvalue2+"<br>";

2 s2 A% f( p0 e9 N

Response->Content=h0+s1+" <br>"+ : H3 f4 R4 \! c/ E9 t5 L s2+" <br>"+ h1; ; e% i. Q1 |$ x1 R) t: L} 6 @3 Y2 c; ]4 L

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 02:07 , Processed in 0.433255 second(s), 51 queries .

回顶部