Cookie 的简介
作为 Web 服务器端的程序,我们可以给一个 Cookie。浏览器下次过来访问的时候,我们可以把之前给的 Cookie 读回来。简单说,一个 Cookie 就是一个字符串。比如你可以把这个用户登录的用户名记录在里面。
因为,WEB 服务器是无状态的,同一个浏览器两次访问服务器,服务器并不知道上一次的用户状态,比如用户的名字。使用 Cookie 则可以在浏览器访问服务器的时候,浏览器把上一次服务器发送的 Cookie 送回去服务器,服务器因此可以通过读浏览器访问的 Cookie 来知道这个用户上一次访问的一些状态值。
Delphi WebBroker 程序如何操作 Cookie
服务器创建 Cookie
客户端访问服务器,服务器可以在发送页面 HTML 的同时,发送 Cookie 给浏览器。代码如下:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
ACookie: TCookie;
begin
ACookie := Response.Cookies.Add;
ACookie.Name := 'USER_ID';
ACookie.Value := 'pcplayer';
ACookie.Expires := Now + 1;
Response.Content := '<html><head></head><body>你好!</body></html>';
end;
服务器读 Cookie
客户端访问服务器,服务器都可以去读 Cookie,当然,可能这个 Cookie 不存在,读不到,则读到的是空字符串。代码如下:
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
UserId: string;
begin
UserId := Request.CookieFields.Values['USER_ID'];
Response.Content := '<html><head></head><body> Hello ' + UserId + '</body></html>';
end;
另外:Cookie 可以是很多个。上面的 ACookie := Response.Cookies.Add; 执行一次,就是一个。在程序里面我们看到的是对象,其实它就是个 TStringList,通过 Name=Value 的方式读写。
一个小问题
我们给的 Cookie 赋值时,如果是中文,问题来了。
按照上面的代码,赋值中文,读回来的,是一堆类似这样的东西:'%E6%9D%8E%E5%88%9A'
需要进行解码。解码的代码如下:
TNetEncoding.URL.Decode(UserId)
注意,使用 TNetEncoding 需要 uses System.NetEncoding;
为什么说它是问题
对于程序来说,应该输入和输出相同。但是这里,输出需要额外增加一个解码,是因为输入的中文,不知道在哪个环节,被编码了。既然有编码的环节,就应该有对应的解码的环节才对。