Rails 会话管理全解析
1. 会话基础
HTTP 是无状态协议,若没有会话概念,就无法关联不同的 HTTP 请求,也难以识别访问应用的用户。当新用户访问 Rails 应用时,会自动创建新会话。会话既指用户使用应用的时间段,也指为用户保存的持久哈希数据结构,由唯一的会话 ID(32 位随机十六进制字符串)标识。新会话创建时,Rails 会自动向浏览器发送包含会话 ID 的 cookie,之后浏览器每次请求都会将会话 ID 传回服务器以保持连续性。
Rails 设计 Web 应用时,建议尽量少用会话存储有状态数据,数据持久化存储应放在数据库中。因为在用户会话哈希中保留对象时间越长,越难保证对象与数据库数据一致。
2. 会话存储内容
决定会话哈希中存储内容并不难,遵循尽量少存原则即可。一般来说,整数(用于键值)和短字符串消息可以存储,对象则不适合。
多数 Rails 应用会在会话中存储 current_user_id ,而非当前用户对象。认证系统应在每次请求前从数据库加载用户实例,并通过 ApplicationController 上的方法统一提供。这样能在不等待会话过期的情况下禁用特定用户的访问权限。
存储对象到会话的一般准则如下:
- 必须能被 Ruby 的 Marshal API 序列化,排除数据库连接和其他 I/O 对象等特定类型。
- 大型对象图可能超出会话存储大小限制,具体取决于所选的会话存储机制。
- 关键数据不应存储在会话中,因为用户结束会话(关闭浏览器或清除 cookie)可能导致数据丢失。
- 频繁更
超级会员免费看
订阅专栏 解锁全文
346

被折叠的 条评论
为什么被折叠?



