利用delphi制作网站的问题(100分)

  • 主题发起人 主题发起人 lfq
  • 开始时间 开始时间
L

lfq

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用delphi制作网站,由于要保存用户的注册信息,使用了Twebresponse的
cookies属性,希望能在客户端保存cookies信息,结果发现无论如何写入的cookies都无法读出,不知适合原因?如果cookies不可用,还有什么方法可解决我的问题?
(我用的浏览器是ie5)
 
怎么写的?怎么读的?

你的ie的cookie enable了没?

实在不行,用CGIExpert写cookie,保你满意
 
写的方法如下:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var name,pass:string;ok:boolean;
begin
name:=request.ContentFields.Values['name'];
pass:=request.ContentFields.Values['pass'];
if (name<>'')and(pass<>'') then
{with adotable1 do}
begin
ok:=false;
adoconnection1.connected:=true;
adoquery1.sql.clear;
adoquery1.sql.add('select * from userinfo where 用户名='''+name+'''');
adoquery1.open;
if adoquery1.RecordCount<>1 then response.content:='注册失败'+inttostr(adoquery1.RecordCount)
else if adoquery1.fieldbyname('用户口令').asstring=pass then
begin
adoquery1.edit;
adoquery1.fieldbyname('是否在线').value:=true;
adoquery1.fieldbyname('注册次数').asinteger:=adoquery1.fieldbyname('注册次数').asinteger+1;
adoquery1.post;
Response.Cookies.Add.Name :='name';{请注意这几行!}
Response.Cookies.Add.Value :=name;
Response.Cookies.Add.Expires := Now + 1;
response.content:='注册成功'
end
else response.content:='口令不对';
adoquery1.close;
adoconnection1.connected:=false;
end
else response.Content:='用户名和口令不能为空';
response.Sendresponse;
end;

读的方法很简单,使用asp对象:request.cookies("name")

至于ie5的当然能用cookies了,实际上,我用asp写的cookies就可以很正确地读取
而用delphi则不行!

 
delphi是可以实现cookies的,我曾经实现过。
首先你要判断一下cookies是否正确加入,是要设置ie5的cookies提示便可。
如果cookies被正确加入,再检查一下你的读cookies的代码。
给你个例子,可以参考一下:
放置cookies
Cookies:=TStringList.Create;
Cookies.Add('UserID='+UserId);
Response.SetCookieField(Cookies,'','/',-1,false);
Cookies.Free;
Response.content:='correctly set cookie';//必须要有response才行
Handled:=true;
收cookies的信息
var
tdata:Tstrings;

tdata:= Request.CookieFields;
userid:=trim(tdata.Values['userid']);
 
使用cookie的例子:http;//www.net-wing.net/kangwei


    根据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;

原程序:http://202.98.107.86/tyb/delphi/mycount.zip
 
后退
顶部