有这样的一个需求:
需要取得网站所有的在线用户的session, 并且能通过session_id 找到对应的用户
需要取得网站所有的在线用户的session, 并且能通过session_id 找到对应的用户
- session保存到数据库中
修改配置文件
运行config.action_controller.session_store = :active_record_store
rake db:sessions:create
- 如何从数据库中取得session,并且对应user_id?
session.data的数据如下ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id) session.data
{:_csrf_token=>"MxXYJUUvtlazW2xani9B4hWQTX5hxLRG38eeHoUq8S0=", "warden.user.user.key"=>[User(id: integer, email: string, encrypted_password: string, password_salt: string, reset_password_token: string, remember_token: string, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, username: string, pwd: string, phone: string, visited: integer, avatar_file_name: string, avatar_content_type: string, avatar_file_size: integer, avatar_updated_at: datetime, apple_token: string, client: string), 2], "flash"=>{:notice=>"注册成功.", :error=>nil, :user_signed_up=>true, :alert=>nil}}
然后取用户数据
User.find_by_id(sess.data["warden.user.user.key"].last)
- 补充说明-----------------------------------------------------------------------------
在使用
取session data的时候,会抛出如下异常ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id) session.data
ActiveRecord::StatementInvalid (Mysql::Error: query: not connected: SELECT * FROM sessions WHERE session_id='9ba7d546733f6b50069d760a8e03829e')
所以,当显示该异常的时候,代码需要修改为
sid = params[:sid] connection = ActiveRecord::Base.connection sql = "select * from sessions where session_id = '#{sid}'" record = connection.select_one(sql) data = record["data"] logger.info data User.first str = ActiveSupport::Base64.decode64 data ss = Marshal.load(str) @user = User.find_by_id(ss["warden.user.user.key"].last)
注意的地方是:
User.first 一定需要调用一次,否则
Marshal.load 将无法识别 User!
太诡异了,具体原因还不清楚