Delphi WebBroker 处理 Cookie 的一个小问题

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;

为什么说它是问题

对于程序来说,应该输入和输出相同。但是这里,输出需要额外增加一个解码,是因为输入的中文,不知道在哪个环节,被编码了。既然有编码的环节,就应该有对应的解码的环节才对。

猜你喜欢

转载自blog.csdn.net/pcplayer/article/details/142472529