Help us learn about your current experience with the documentation. Take the survey.
访问会话数据
GitLab 中的会话数据存储在 Redis 中,可以通过多种方式访问。
例如,在 Web 请求期间:
- Rails 通过
ActionDispatch::Session提供从控制器内部访问会话的能力。 - 在控制器之外,可以通过
Gitlab::Session访问会话。
在 Web 请求之外,仍然可以访问存储在 Redis 中的会话。例如:
- 可以直接在 Redis 中查找 会话 ID 和内容。
- 可以通过
ActiveSession访问与该会话关联的 UserAgent 数据。
在会话中存储值时,最好遵循以下原则:
- 使用简单的原始数据类型,避免存储对象,以避免序列化(marshaling)带来的复杂性。
- 清理不再需要的变量,以降低 Redis 的内存使用。
GitLab::Session
有时,您可能希望将数据持久化存储在会话中,而不是像数据库这样的其他存储方式。Gitlab::Session 让您可以访问这些数据,而无需在代码中大量传递会话对象。例如,您可以在策略(policy)内部访问它,而无需在每次检查权限时都传递会话。
会话具有类似哈希(hash)的接口,就像在控制器中使用它一样。还有一个 NamespacedSessionStore 用于在哈希中存储键值对数据。
# 查询当前会话中存储的值
Gitlab::Session.current[:my_feature]
# 修改存储在 Redis 中的当前会话
Gitlab::Session.current[:my_feature] = value
# 在某个键下命名空间存储键值对数据
Gitlab::NamespacedSessionStore.new(:my_feature)[some_key] = value
# 为一段代码块(例如测试)设置会话
Gitlab::Session.with_session(my_feature: value) do
# 使用 Session.current[:my_feature] 的代码
endRedis
可以直接通过 Redis 访问会话数据。这可以在调试时让您检查浏览器会话。
# 获取会话列表
session_ids = Gitlab::Redis::Sessions.with do |redis|
redis.smembers("#{Gitlab::Redis::Sessions::USER_SESSIONS_LOOKUP_NAMESPACE}:#{user.id}")
end
# 检索特定会话
session_data = Gitlab::Redis::Sessions.with { |redis| redis.get("#{Gitlab::Redis::Sessions::SESSION_NAMESPACE}:#{session_id}") }
Marshal.load(session_data)使用 ActiveSession 获取设备信息
用户资料页面上的 活动会话 页面显示了用于访问每个会话的设备信息。其中用于列出会话的方法在开发时也很有用。
# 获取指定用户的会话列表
# 包含 session_id 和来自 UserAgent 的数据
ActiveSession.list(user)