发信人: teleme(PassWord)
整理人: teleme(2001-02-11 10:47:37), 站内信件
|
深圳科技园华为公司 傅贵
---- Cookies 是 一 种Web 服 务 器 在 客 户 端 存 储 和 返 回 信 息 的
机 制, 这种 简 单 的、 永 久 的 和 基 于 客 户 端 的 状 态 信 息 大 大
的 扩 充 了 基 于Web 的 客 户/ 服 务 器(Client/Server) 应 用 程 序 的
能 力。 因 此 广 泛 应 用 在大 量 的 实 际 中, 例 如 所 有 订 阅Micr
osoft 公 司 的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,TWebRes
ponse,TPageProducer 等大 量 的 对 象 供 使 用. 对 于Cookie,Delphi3 也
提 供 了 大 量 的 程 序 供 使 用,
如TWebResponse.Cookies,TWebResponse.SetCookieField,TWebRequest.Cooki
e,
TWebRequest.CookieFields,TWebRequest.ExtractCookieFields 等, 应 该 是
非 常 方 便。
但 本 人 为 了 实 现 一 功 能 需 要 设 置Cookie, 但 是 发 现 使 用Del
phi 提 供 的SetCookieFields 设 置 不 成 功, 经 研 究Delphi 3 所 带 的
HttpApp.Pas 和IsapiApp.Pas 文 件 发 现 在 中 文Windows 95 和NT 环 境 下
该 程 序 有 错 误。
---- 根 据Netscape 公 司 的 规 定,Cookie 的 格 式 应 为:
---- Set-Cookie: Name=Value; expires=DATA; Path=PATH; domain=DOMAIN_NA
ME; secure
---- 而 且 根 据 规 定, 日 期(DATA) 的 设 置 必 须 满 足 格 式“Wdy, D
D-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 文 件 拷 贝 到L
ib 目 录, 这 样 会 完 全 改 正 错 误, 这 样 是 最 根 本 的 解 决 方
法, 但 是 如 果 将 源 程 序 放 在 另 一 未 修 改 的Delphi 中( 例 如 提
供 源 程 序 给 别 人 和 自 己 重 新 安 装) 编 译 又 将 出 现 问 题。2
、 因 为 使 用 并 不 太 多, 所 以 可 以 将 修 改
的 程 序 放 在 自 己 的 程 序 中, 使 用Delphi 3 提 供 的WebResponse.S
etCustomHeader 设 置, 这 样 的 好 处 是 将 程 序 放 在 自 己 的 程 序
内, 重 新 装Delphi 或 在 另 一 台 计 算 机 上 编 译 的 结 果 也 会 完
全 正 确。 因 为Cookie 的 目 的 一 般 有 两 种, 一 种 是 在 此 会 话
过 程 中 使 用, 过 后 不 使 用, 此 时 不 需 要Expires 段, 不 会 产
生 时 间 错 误, 可 以 使 用
Delphi 3 提 供 的 所 有Cookie 程 序; 另 一 种 为 永 久 保 存, 时 间
一 般 越 长 越 好, 于 是 可 以 将 时 间 设 置 为2099 年 二 月22 日, 于
是 程 序 中 设 置Cookie 的 方 法 为:
---- Response.SetCustomHeader('Set-Cookie','Name=Value; expires=Sun, 2
2 Feb 2099 08:08:08
GMT'); ( 注 斜 体 用 自 己 的 名 称 代 替, 例 如 设 置Count =10, 则
Name 用Count 代 替,Value 用10 代 替), 这 样 就 可 以 建 立Cookie 了.
---- 以 下 为 建 立 一 个 访 问 计 数 器 的 程 序, 可 以 参 照: cons
t
LastIp:String='0:0:0:0'; //避免重复计数Var S:String; Count:Integer;be
gin
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.Remo
teAddr;
Response.SetCustomHeader('Set-Cookie','
count='+IntToStr(Count)+'; expires=Sun, 21 Feb 2010 08:08:08 GMT');
Response.Content:='您是第'+IntToStr(Count)+'来到本页!';End;
---- ( 以 上 程 序 用Win95B 的 个 人Web 服 务 器 +Netscape Navigator
4.04 调 试 通 过)
[from: http://caozhiwei.163.net/]
|
|