Ruby CGI 通过 CGI::Session 提供了基本的会话管理功能,允许在多个请求之间存储和共享用户数据。使用会话可以实现用户身份验证、购物车、用户设置等功能。本指南将介绍如何在 Ruby 中使用 CGI Session 来管理用户会话。


📌 目录

  1. 🔹 什么是 Session?
  2. 🔹 使用 CGI::Session
  3. 🔹 创建和使用 Session
  4. 🔹 获取和修改 Session 数据
  5. 🔹 销毁 Session
  6. 🔹 Session 安全性和设置
  7. 🔹 CGI::Session 完整示例
  8. 🔹 参考资料

🔹 什么是 Session?

Session(会话)是 Web 开发中用于跨多个请求保持用户状态的机制。Session 会在客户端和服务器之间传递一个唯一的会话 ID,该 ID 用于识别和存储与用户相关的数据。

Session 与 Cookie 的区别

  • Cookie 是客户端存储数据,而 Session 存储在服务器端,仅通过唯一的 Session ID 在客户端和服务器之间传递。
  • Cookie 用于简单的存储,而 Session 更适合存储 安全性高较大的数据

🔹 使用 CGI::Session

CGI::Session 是 Ruby 提供的会话管理模块,它将用户数据存储在服务器上,并通过 Cookie(通常是 CGISESSID)来标识会话。

基本用法

require 'cgi/session'

cgi = CGI.new
session = CGI::Session.new(cgi)

  • CGI::Session 需要传入 CGI 对象以创建会话。
  • 会话 ID 通常会保存在 Cookie 中,服务器端会根据该 ID 找到对应的会话数据。

🔹 创建和使用 Session

1. 创建 Session

创建 Session 时,首先需要通过 CGI::Session.new 初始化一个会话对象。

require 'cgi/session'

cgi = CGI.new
session = CGI::Session.new(cgi)
session['username'] = 'RubyUser'  # 设置会话变量

  • 使用 session[key] = value 存储数据。

2. 设置会话过期时间

通过 expire_after 设置会话的过期时间。

session = CGI::Session.new(cgi, "expire_after" => 3600)  # 1 小时后过期

  • expire_after 设置以秒为单位的过期时间。

🔹 获取和修改 Session 数据

1. 获取 Session 数据

username = session['username']
puts "Hello, #{username}!"

  • 使用 session['key'] 获取存储的会话数据。

2. 修改 Session 数据

session['username'] = 'NewUser'
puts "Session updated: #{session['username']}"

  • 使用 session['key'] = value 来修改已存储的数据。

3. 删除 Session 数据

session.delete('username')
puts "Session deleted: #{session['username']}"

  • 使用 session.delete('key') 删除特定的数据。

🔹 销毁 Session

在用户退出或不再需要会话数据时,销毁会话是很重要的。

销毁 Session

session.delete
puts "Session has been destroyed."

  • session.delete 会销毁当前的会话数据,并删除与之关联的 Session ID。

销毁并删除所有数据

session.delete('username')
session.delete('cart')
puts "All session data has been deleted."

  • 可以删除会话中的所有数据,确保会话彻底结束。

🔹 Session 安全性和设置

1. 设置 Session ID Cookie 名称

可以通过 CGI::Sessioncookie_name 参数设置 Session ID 的 Cookie 名称。

session = CGI::Session.new(cgi, "cookie_name" => "my_session_id")

2. 使 Session 仅通过 HTTPS 传输

如果应用需要更高的安全性,可以要求仅通过 HTTPS 传输会话 ID。

session = CGI::Session.new(cgi, "secure" => true)  # 仅 HTTPS

  • securetrue 时,Session ID 将只通过 HTTPS 传输。

3. 防止 JavaScript 访问 Session ID

session = CGI::Session.new(cgi, "httponly" => true)

  • httponlytrue 时,JavaScript 无法通过 document.cookie 访问会话 ID。

🔹 CGI::Session 完整示例

下面是一个简单的用户登录示例,展示了如何使用 CGI::Session 来管理用户的登录状态。

示例代码:用户登录与登出

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

cgi = CGI.new
session = CGI::Session.new(cgi)

action = cgi['action']

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

case action
when "login"
  session['username'] = cgi['username']
  puts "<h1>Welcome, #{session['username']}!</h1>"
  puts "<p><a href='?action=logout'>Logout</a></p>"
when "logout"
  session.delete
  puts "<h1>You have logged out</h1>"
  puts "<p><a href='?action=login'>Login again</a></p>"
else
  puts "<h1>Please login</h1>"
  puts "<form method='post' action='?action=login'>"
  puts "<input type='text' name='username' placeholder='Username'>"
  puts "<input type='submit' value='Login'>"
  puts "</form>"
end

运行示例

  • 访问 http://localhost/cgi-bin/session_example.rb?action=login,输入用户名后登录。
  • 登录后可以选择退出:http://localhost/cgi-bin/session_example.rb?action=logout

🔹 参考资料


总结

  • 使用 CGI::Session 可以方便地管理 Web 应用中的用户会话。
  • 通过 session[key] = value 存储数据,通过 session[key] 获取数据。
  • 需要时可以设置会话的过期时间和销毁会话。
  • 为了增加安全性,可以启用 securehttponly 选项来保护会话 ID。

💡 使用 CGI::Session,你可以实现 持久化用户数据,如 登录状态、用户设置、购物车 等功能。