QQ登录

只需要一步,快速开始

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

Web变量Cookie的使用

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

[作者:扬州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, _# e

void __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

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

回顶部