ruby on rails session 深入探索

本文介绍了一种通过数据库获取在线用户Session的方法,并详细说明了如何通过Session ID找到对应的用户信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有这样的一个需求:
需要取得网站所有的在线用户的session, 并且能通过session_id 找到对应的用户

  1.   session保存到数据库中
    修改配置文件
    config.action_controller.session_store = :active_record_store
    运行
    rake db:sessions:create 


  2. 如何从数据库中取得session,并且对应user_id?
    ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect
    session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id)
    session.data 
    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)

  3. 补充说明-----------------------------------------------------------------------------
    在使用
    ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect
    session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id)
    session.data 
    取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!
    太诡异了,具体原因还不清楚



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值