Ruby 提供了 CGI::Cookie 处理 HTTP Cookie,允许 Web 应用存储用户状态、会话信息等。本文介绍 Ruby CGI 中 Cookie 的创建、读取、修改和删除,并包含 代码示例和注意事项


📌 目录

  1. 🔹 什么是 Cookie?
  2. 🔹 CGI::Cookie 简介
  3. 🔹 设置 Cookie
  4. 🔹 读取 Cookie
  5. 🔹 修改 Cookie
  6. 🔹 删除 Cookie
  7. 🔹 Cookie 选项说明
  8. 🔹 Cookie 实践示例
  9. 🔹 参考资料

🔹 什么是 Cookie?

Cookie 是 Web 服务器 存储在 浏览器 端的小型文本数据,可用于:

  • 身份验证(如 Session ID)
  • 保存用户偏好(如语言、主题)
  • 跟踪用户行为(如统计分析)

在 Ruby 的 CGI 编程中,CGI::Cookie 允许 Web 应用管理 Cookie。


🔹 CGI::Cookie 简介

Ruby 提供 CGI::Cookie 类用于创建、读取、修改和删除 Cookie。

语法

CGI::Cookie.new(name: "cookie_name", value: "cookie_value", expires: Time.now + 3600)

参数说明

参数说明
nameCookie 名称
valueCookie 值(字符串或数组)
expires过期时间(默认 nil,会话 Cookie)
pathCookie 作用路径(默认 /
domain作用域(如 .example.com,默认 nil
secure是否仅限 HTTPS 传输(true/false
httponly是否禁止 JavaScript 访问(防止 XSS)

🔹 设置 Cookie

服务器端通过 cgi.header 发送 Cookie 给客户端。

1. 发送单个 Cookie

require 'cgi'

cgi = CGI.new
cookie = CGI::Cookie.new("name" => "user", "value" => "RubyUser", "expires" => Time.now + 3600)

puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 设置成功</h1>"

响应头

Set-Cookie: user=RubyUser; expires=Wed, 03-Apr-2024 12:00:00 GMT; path=/

2. 发送多个 Cookie

cookie1 = CGI::Cookie.new("name" => "user", "value" => "RubyUser")
cookie2 = CGI::Cookie.new("name" => "session", "value" => "123ABC")

puts cgi.header("cookie" => [cookie1, cookie2])


🔹 读取 Cookie

浏览器每次请求时,都会自动附带 Cookie,可用 cgi.cookies 读取。

require 'cgi'

cgi = CGI.new
cookies = cgi.cookies

user_cookie = cookies["user"]  # 读取名为 user 的 Cookie
session_cookie = cookies["session"]

puts "Content-type: text/html\n\n"
puts "<h1>读取 Cookie</h1>"
puts "<p>User: #{user_cookie}</p>"
puts "<p>Session: #{session_cookie}</p>"

示例请求头

Cookie: user=RubyUser; session=123ABC


🔹 修改 Cookie

修改 Cookie 需要 重新发送 Set-Cookie 头部

require 'cgi'

cgi = CGI.new
cookie = CGI::Cookie.new("name" => "user", "value" => "UpdatedUser", "expires" => Time.now + 3600)

puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 已修改</h1>"

新响应

Set-Cookie: user=UpdatedUser; expires=Wed, 03-Apr-2024 13:00:00 GMT; path=/


🔹 删除 Cookie

要删除 Cookie,需将 expires 设为 过去的时间

cookie = CGI::Cookie.new("name" => "user", "value" => "", "expires" => Time.at(0))
puts cgi.header("cookie" => cookie)
puts "<h1>Cookie 已删除</h1>"

删除响应

Set-Cookie: user=; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/


🔹 Cookie 选项说明

Ruby 支持多种 Cookie 选项,可增强 安全性和作用范围

1. 设定 Cookie 作用路径(Path)

cookie = CGI::Cookie.new("name" => "session", "value" => "123ABC", "path" => "/admin")
puts cgi.header("cookie" => cookie)

🔹 仅在 /admin 下有效,/user 访问不到。

2. 设定 Cookie 作用域(Domain)

cookie = CGI::Cookie.new("name" => "user", "value" => "Ruby", "domain" => ".example.com")
puts cgi.header("cookie" => cookie)

🔹 子域(sub.example.com)也能访问。

3. 设定 Secure 仅 HTTPS 传输

cookie = CGI::Cookie.new("name" => "secure_cookie", "value" => "SecretData", "secure" => true)
puts cgi.header("cookie" => cookie)

🔹 浏览器仅在 HTTPS 连接时发送此 Cookie。

4. 设定 HttpOnly 防止 XSS 攻击

cookie = CGI::Cookie.new("name" => "session", "value" => "abc123", "httponly" => true)
puts cgi.header("cookie" => cookie)

🔹 JavaScript 不能读取此 Cookie,有效防止 XSS。


🔹 Cookie 实践示例

📌 完整示例:设置、读取和删除 Cookie

#!/usr/bin/env ruby
require 'cgi'

cgi = CGI.new
action = cgi['action']

puts "Content-type: text/html\n\n"

case action
when "set"
  cookie = CGI::Cookie.new("name" => "user", "value" => "RubyUser", "expires" => Time.now + 3600)
  puts cgi.header("cookie" => cookie)
  puts "<p>Cookie 已设置</p>"
when "read"
  cookies = cgi.cookies
  user = cookies["user"]
  puts "<p>读取 Cookie: #{user}</p>"
when "delete"
  cookie = CGI::Cookie.new("name" => "user", "value" => "", "expires" => Time.at(0))
  puts cgi.header("cookie" => cookie)
  puts "<p>Cookie 已删除</p>"
end

访问

  • 设置 Cookie: http://localhost/cgi-bin/cookie.rb?action=set
  • 读取 Cookie: http://localhost/cgi-bin/cookie.rb?action=read
  • 删除 Cookie: http://localhost/cgi-bin/cookie.rb?action=delete

🔹 参考资料


总结

  • CGI::Cookie.new 创建 Cookie
  • cgi.header("cookie" => cookie) 发送 Cookie
  • cgi.cookies 读取 Cookie
  • expires = Time.at(0) 删除 Cookie
  • secure: true 仅限 HTTPS,httponly: true 防 XSS

💡 Ruby CGI Cookie 适用于 用户登录、会话管理、个性化设置 🚀