http协议是无状态协议。但对于一个商业网站,它需要保持不同的页面间的会话信息。
如用户在网站注册过程中需要跳转页面,但又要保证之前填写的信息部丢失。
这种情况下 cookie 很好的帮我们解决了问题。
cookies集合是附属于response对象及request对象的数据集合,使用时需要在前面加上response或request。
用于给客户机发送cookies的语法通常为:
当给不存在的cookies集合设置时,就会在客户机创建,如果该cookies己存在,则会被代替。由于cookies是作为http传输的头信息的一部分发给客户机的,所以向客户机发送cookies的代码一般放在发送给浏览器的html文件的标记之前。
如果用户要读取cookies,则必须使用request对象的cookies集合,其使用方法是: 需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与server进行cookies集合的数据交换,一旦浏览器开始接收server所下载的数据,cookies的数据交换则停止,为了避免错误,要在程序和前面加上response.buffer=true。
你可以创建一个名为 cookie 的对象并存储文本信息,将该信息发送至浏览器,调用 cgi.out 设置cookie的头部:
#!/usr/bin/ruby require "cgi" cgi = cgi.new("html4") cookie = cgi::cookie.new('name' => 'mycookie', 'value' => 'zara ali', 'expires' => time.now + 3600) cgi.out('cookie' => cookie) do cgi.head + cgi.body { "cookie stored" } end
接下来我们回到这个页面,并查找cookie值,如下所示:
#!/usr/bin/ruby require "cgi" cgi = cgi.new("html4") cookie = cgi.cookies['mycookie'] cgi.out('cookie' => cookie) do cgi.head + cgi.body { cookie[0] } end
cgi::cookie对象实例化时包含以下参数:
参数 | 描述 |
---|---|
name | 规定 cookie 的名称。 |
value | 规定 cookie 的值。 |
expire | 规定 cookie 的有效期。 |
path | 规定 cookie 的服务器路径。 |
domain | 规定 cookie 的域名。 |
secure | 规定是否通过安全的 https 连接来传输 cookie。 |