|
[作者:扬州BCB]
# U2 Z6 `' \0 F' f( K0 Q- a0 O- ^ 一、 Cookie概述:
) a& Q# q4 i, S* t2 Y, @ 要求相关知识:网页服务器、ISAPI编程或JavaScrpt脚本。$ G* f' \( J6 S* p' ~) v
Cookie(意为小甜饼)就是在客户浏览网站时网页保存在客户机
, F, B, N! v7 U `( _9 [* m+ j9 Y0 r内的一些变量,由于被起了这个词不达义的名字,使人觉得深不可
6 ]' p: r" y$ S1 r0 z; Z6 A测,其实Cookie很简单,可称为 Web变量,就是一种保存客户变量
) K( R, U; I" P/ ^$ j) P" ]. F的机制, 下次再次访问网页时,网页中的程序就可再次访问到上次
& S0 k, q, x+ l所保存的这些变量,当然客户可以关闭浏览器Cookie这项功能,网
. V: x7 W7 a9 v) \1 [4 t页中的程序就不能访问或保存这些变量,所以利用Cookie纯属雕虫
" u2 } ~- ]/ e2 h# O小技,没有它照样可以;但利用Cookie,网页设计就可将方便客户,' H2 ?3 x( D3 ~: m4 L' c# n
使客户上次输入的一些内容再次把它找出来,免于录入重复的内容;
; v: P0 a& A9 f0 w1 R! f! x 二、JavaScript脚本对Cookie变量的存取:
+ X1 q0 C7 U8 F7 e9 r8 q4 a9 k JavaScript是运行在客户端的脚本程序,用它可将文本输入& O# K C+ R F* u' i% w
框的内容以Cookie变量的形式保存下来,在客户端保存Cookie可稍8 g* c8 Z2 J* c# q
微减轻Web服务器的一点负担: % Y0 Y- l6 C, w# o0 F `
1>读出Cookie:
, @5 i5 q& m4 C( r1 J JavaScript中可通过document.cookie访问到所有Cookie: {, e* q: p7 f* z+ r
"变量1=值1;变量2=值2;变量3=值3;"% |- O9 O4 A+ ~
需经过串分解就可得到每一个变量名及值;
2 h) O' f1 w! d$ R6 r5 E" {! a 2>写Cookie:6 g2 U( V* J' E! t
email="bush@usa.com";
$ a% D9 n8 ~' @0 O" ]- J1 P/ ]9 O firstname="jorge";" E0 P+ u: \$ b
lastname="bush";1 x1 {, N" V3 k! y. p0 m' m4 {* \$ W
expireDate="Thursday,01-Jan-2099 12:00:00 GMT";
+ Q' t) v+ @& ` `- M+ Y document.cookie="email="+email+";expires="+expireDate;( I) [& Q# u6 Q1 ?$ v
document.cookie="firstname="+firstname+";expires="+expireDate;( S1 E: C! P/ z! G' s
document.cookie="lastname="+lastname+";expires="+expireDate; 2 `" I/ _2 y W! D
下页一例,将网页的文本输入框域变量NAME自动保存下来:
. W+ M; m7 t- H4 C4 l<script language="JavaScript">8 }$ m) r( o( R5 q5 C; ^/ m9 s
<!--! I5 u0 k: _! l9 i* U& }& K
function getValue(s,n) // 分解Cookie表达式s: ?! Y8 h2 ^; w3 j0 p
{4 |$ ?% ?) y% v$ U+ Q% U! n
var pairs=s.split(";"); // 分解成串数组
; H9 X4 \! n$ U9 Y for (var i=0;i<pairs.length;i++)7 O8 y) L1 Y! a3 c* l
{
9 _6 L& y* ^0 D4 R0 r7 e var pairSplit=pairs.split("=");! P4 h% N, k5 l% j( {
if (pairSplit[0]==n) file://查找n
1 h0 o* m# C9 S/ W3 Q return pairSplit[1]; file://取到n的值
9 o" K6 o& Q& c+ `+ h }
. I! s3 p8 J4 ` return "";5 F0 }. q; |; [" k/ y. f3 }7 M
}- F* y% q: f; p
function getName() file://取Cookie中的姓名NAME
& l" t8 g& {* {7 {, y{
3 K" h: v( j) V var s=document.cookie; // 取所保存的Cookie# ^3 L6 ` y" y: x8 Q$ A9 E
NAME0=getValue(s,"NAME");
, g- `6 a, j* M3 H' Q% r; S& ?1 f form1.NAME.value=NAME0;3 B3 X9 E$ P% U @$ }
}
e& Y8 g1 v* e( K& B. E u. ?function newCookie() file://将Cookie中存姓名
' y* A: v1 a% W' Q: g" F% X6 n{/ _* O2 \. ~6 |, M0 a
var s=form1.NAME.value;; q0 n" O& G# F- J1 S$ [
if (s!="" && s!=NAME0) // 非空则保存: K, E) B L+ E R0 U7 a6 G
{# o. B) ^* r& t( T
s="NAME="+s;6 w5 u/ y/ E' {2 J. u
s+=";expires=Thursday,01-Jan-2099 12:00:00 GMT";! i# P7 i, u7 W' X2 M4 _6 ]+ }
document.cookie=s; // 将保存到客户机中' T/ ]$ \5 x. M
}
" B" c+ ~# T; V* V$ J8 i}
; y" M6 q0 @6 f% gfile://--></script>
2 X5 ?! x1 f3 S8 h* c& J..................
% J1 ]6 C9 t: b* `' A6 O$ M$ r<body bgcolor="#00FFFF" onload="getName();! t& j; }# _8 a1 P$ H0 o$ J2 s6 j6 ?
form1.TEXT.focus()" onunload="newCookie()">
0 F% g$ i" v1 c<!进入本网页时将执行onload中的getName()>
3 j, o1 S+ G7 E% J/ y/ g<!退出本网页时将执行onunload中的newCookie()>
8 Q8 ^# C4 B0 _5 K) \% H. ]: f..................
$ K0 F$ v2 S( w4 j 三、BCB与Delphi中用ISAPI对Cookie的存取:
2 U" w8 s" C; ]1 L [注:Delphi用 .代替BCB的->]
1 W3 O' @) L; g3 v9 y, G 与JavaScript不同的是,ISAPI是运行在Web服务器端的程序,
/ ^1 R# G% w4 r! J* ?& t它也可以读取与存入Cookie变量:
+ z' w7 i9 \! a 假设处理用户提交的方法如下:
& p# Z. U% Y* f H: e) Ivoid __fastcall TWebModule1::WebModule1Action(TObject *Sender,
2 }. p2 N& f4 e) a+ ITWebRequest *Request, TWebResponse *Response, bool &Handled)
& u1 Y( G# B# ^( Q4 _5 F* q 1>从客户机中读取Cookie:
+ G# C" h' G8 }. k) z4 B4 Y Request->CookieFields是个串数组TStrings *,如果不为; V. k& W, r6 P/ v- N' p; W9 \
空,每一行都将是如下形式:1 o, o$ c3 q/ i: D5 C' U- F
Cookie变量名=值
( s, v8 M" ~- t" v+ i共有Request->CookieFields->Count个变量,1 c9 B# d) L$ Z1 q) m8 W# `
变量名为Request->CookieFields->Names; (i>=0)
6 ~8 ^8 _* h! i0 h; X8 ?% OReauest->CookieFields->Values["变量名"]就是对应的值;
7 d' }+ R9 W! q8 D) n+ t0 p! y请注意: 客户首次访问网页时,客户机中并不存在你将要设的. \6 C4 n5 D0 i5 X
Cookie变量,所以第一次Request->CookieFields将是空的; ! r d% B. A8 s& c$ J8 O2 C8 @( t) A, z6 o
2>将Cookie变量保存客户机中:0 I6 ~8 S) l9 G6 |1 Q
TCookie *pNewCookie = Response->Cookies->Add();
' e, w& f0 H, D7 R1 S- a2 q pNewCookie->Name="变量名1";
& N" a& ~5 D* t) g5 b pNewCookie->Value="值1";5 J) A; m3 ]$ ^% b5 [/ Y7 s
pNewCookie->Expires = Now()+366; // 保存一年5 ]; v. ~4 _2 _ d2 Y
就可设定Cookie变量的新值,并不改变未作修改的原有其它变量;
; Q. O M% x% F8 z m' p0 }& R举一例:利用两个Cookie变量计数,并显示给用户,当向网页服务器提交) j7 z$ x5 J4 Y% M( _1 u
.DLL后,每刷新一次浏览器,将看到计数值将变化一次:
2 A6 M* e- ]; n Q, _# evoid __fastcall TWebModule1::WebModule1WebActionItem1Action(5 k2 k3 y, C5 q
TObject *Sender, TWebRequest *Request, TWebResponse *Response,8 y+ d$ |8 m6 X, u, e8 Q
bool &Handled)$ J0 D6 \6 y- G- C
{+ |- K3 L2 c8 r' ?) _0 G
TStrings *cookies=Request->CookieFields;: T _$ r7 {) H4 J
String oldvalue1=cookies->Values["count1"]; // 取count1旧值, \- F7 d! i s$ A2 l5 l9 k# k$ a0 U/ P
String oldvalue2=cookies->Values["count2"];
; a: b2 ^' b, P G2 c String newvalue1=oldvalue1.ToIntDef(0)+1; // 算新值& s) B8 r+ Y& v0 e6 D+ \
String newvalue2=oldvalue2.ToIntDef(0)+100; ; h4 L& r6 D. _4 G
TCookie *pNewCookie1 = Response->Cookies->Add();( \! d/ X* H: y2 D* W9 P( {: b# o
pNewCookie1->Name="count1"; file://更新Cookie5 K& g% O: B2 D+ [
pNewCookie1->Value=newvalue1;1 }" y' ~' w2 n$ u
pNewCookie1->Expires = Now()+366; // 保存一年
1 I( v8 ?* @, `* Y# q TCookie *pNewCookie2 = Response->Cookies->Add();7 }- U1 M1 B* S+ M% C$ U
pNewCookie2->Name="count2"; file://更新Cookie
" P! m5 ?8 f/ _. u# ]4 p& Y pNewCookie2->Value=newvalue2;# ~ |$ s4 r/ Z3 b) Z& W8 d* T
pNewCookie2->Expires = Now()+31; // 保存一月
* @ I/ I- N$ F) M# |+ Q" N // 向客户显示Cookie的值5 E+ ]9 {8 H/ v
String h0="<html><head></head><body>";
+ W$ q+ g( |. A* R& g1 E- g# O8 l v String h1="</body></html>";% i# U- }" N( a
String s1="计数值1="+newvalue1+"<br>";: l7 K; E" z) J$ l9 f+ B+ V
String s2="计数值2="+newvalue2+"<br>";
% }6 s% t8 r& i) R/ @ Response->Content=h0+s1+" <br>"+; v6 G9 U+ s2 l4 @; X: a3 K; D3 w
s2+" <br>"+ h1;
# j& n2 a& K& b} % Z) j# S) N: E" l
|