COOKIES 的小问题?(200分)

  • 主题发起人 主题发起人 U_123
  • 开始时间 开始时间
U

U_123

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TformMain.IWDBGrid1Columns0Click(ASender: TObject;
const AValue: String);

begin
with webapplication.Response do
begin
cookies.Clear;
cookies.Add;
cookies[0].Name:='XH';//学号
COOKIES[0].Value:=dm.query1.FieldValues['XH'];
cookies.Add;
cookies[1].Name:='XM';//姓名
cookies[1].Value:=dm.query1.FieldValues['XM'];
end;
end;

procedure TformMain.IWButton1Click(Sender: TObject);
begin
with webapplication.Request do
begin
iwedit1.Text:=cookiefields.Values['XH'];
IWedit2.Text:=cookiefields.Values['XM'];
end;
end;
数字,字母(学号).正常显示,但汉字(姓名)却是%d%c...不知为何?
且没有建立COOK文本文件.
 
的确有问题!
1、好像对双字节有问题。
2、Request.cookie和Request.CookieFields.Text应该一样,但是后者没问题,前者不行。
3、在intraweb里,你可以通过窗口的hideparams来存储数据。如:
procedure TformMain.IWDBGrid1Columns0Click(ASender: TObject;
const AValue: String);
begin
HiddenParams.Add('xh=001');
HiddenParams.Add('xm=张三');
end;

procedure TformMain.IWButton1Click(Sender: TObject);
begin
iwedit1.Text:=HiddenParams.Values['xh'];
IWedit2.Text:=HiddenParams.Values['xm'];
end;





 
问题解决了没有?
 
Delphi中Cookie的建立使用



Cookies是一种Web服务器在客户端存储和返回信息的机制

这种简单的、永久的和基于客 户端的状态信息大大的扩充了基于Web的客户/服务器(Client/Server)应用程序的能力。 因此

广泛应用在大量的实际中,例如所有订阅Microsoft公司的MSDN的用户、访问过Borland

Online的用户,以及访问过我的主页(http://www.nease.net/~borland)的用户都会在本 地存储

Cookie,以便下次访问时提供上次访问的记录。

Delphi 3是Borland公司1997年推出的可视化、面向对象的高效率的快速应用程序开发 工

具(RAD),提供了大量的最新功能,例如开发COM/DCOM,一步开发ActiveX对象,多层

数据库应用程序MIDAS等,并且使用Delphi 3开发基于Web服务器的程序,如ISAPI/NSAPI

, Win-CGI,CGI程序都十分方便。

使用Delphi 3开发Web Server程序是非常简单,方便的,因为在Delphi中提供了Web Module、TWebApplication、TWebRequest、TWebResponse、TPageProducer等大量的对

象供使用.对于Cookie

Delphi3也提供了大量的程序供使用

如TWebResponse.Cookies, TWebResponse.SetCookieField,TWebRequest.Cookie,TWebRequest.CookieFields, TWebRequest.ExtractCookieFields等,应该是非常方便。但本人为了实现一功能需要设 置

Cookie,但是发现使用Delphi提供的SetCookieFields设置不成功,经研究Delphi 3所带 的

HttpApp.Pas和IsapiApp.Pas文件发现在中文Windows 95和NT环境下该程序有错误。

根据Netscape公司的规定

Cookie的格式应为:

Set-Cookie: Name=Value; expires=DATA; Path=PATH;

domain=DOMAIN_NAME; secure

而且根据规定

日期(DATA)的设置必须满足格式“Wdy

DD-Mon-YYYY HH:MM:SS GMT”


基于RFC822

RFC850

RFC1036和RFC1123等规定,但是检查HTTPAPP.PAS中的function

TCookie.GetHeaderValue: string中为FormatDateTime('"expires="' + DateFormat +

' "GMT; "'

Expires);

其中const DateFormat = 'ddd

dd mmm yyyy hh:mm:ss'

此程序在英文环境

中产生的格式是正确的

但是在中文中产生的结果却不对

因为星期和月份都将按照中文的表示方法: 如 将11月生产“十一月”中文串,这样在Netscape Navigator和Microsoft Internet

Explorer就不 能辨认了。

既然错误在于原VCL未考虑中文环境的问题,所以修改的方法有:1、修改VCL源程序,

编译后将dcu文件拷贝到Lib目录,这样会完全改正错误,这样是最根本的解决方法,但是 如果将源程序放在另一未修改的Delphi中(例如提供源程序给别人和自己重新安装)编译又将 出现问题。2、因为使用并不太多,所以可以将修改的程序放在自己的程序中,使用Delphi 3 提供的TWebResponse.SetCustomHeader设置

这样的好处是将程序放在自己的程序内,重新 装Delphi或在另一台计算机上编译的结果也会完全正确。因为Cookie的目的一般有两种,一 种是在此会话过程中使用,过后不使用,此时不需要Expires段,不会产生时间错误,可以使用Delphi 3提供的所有Cookie程序;另一种为永久保存,时间一般越长越好,于是可以将时间设置为2099年二月22日

于是程序中设置Cookie的方法为:

Response.SetCustomHeader('Set-Cookie'

'Name=Value; expires=Sun

22 Feb 2099

08:08:08 GMT'); (注斜体用自己的名称代替,例如设置Count=10,则Name用Count代替,Value 用10代替),这样就可以建立Cookie了.

以下为建立一个访问计数器的程序,可以参照:

const

LastIp:String='0:0:0:0'; //避免重复计数

Var

S:String;

Count:Integer;

begin

S:=Request.CookieFields.Values['count'];

if S<>'' then begin

try

Count:=StrToInt(S);

Except

Count:=0;

End;

end else Count:=0;

if LastIp<>Request.RemoteAddr then Inc(Count);

LastIp:=Request.RemoteAddr;

Response.SetCustomHeader('Set-Cookie'

'count='+IntToStr(Count)+';

expires=Sun

21 Feb 2010

08:08:08 GMT');

Response.Content:='您是第'+IntToStr(Count)+'来到本页!';

End;


(以上程序用Win98的个人Web服务器+Netscape Navigator 4.04调试通过)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
577
import
I
I
回复
0
查看
416
import
I
后退
顶部