如何将Ruby on Rails的Cookie/会话设置为创建后1小时过期
如何在Ruby on Rails中设置会话1小时后过期
你的当前代码使用Rails内置的session和cookie实现身份验证,默认会话在浏览器关闭时过期。要改为创建后1小时过期,可通过以下方式实现:
方法1:全局配置会话过期时间(推荐)
在项目的config/initializers/session_store.rb文件中,添加或修改会话存储配置,指定expire_after参数为1小时:
# config/initializers/session_store.rb Rails.application.config.session_store :cookie_store, key: '_your_app_name_session', # 替换为你的应用名称 expire_after: 1.hour
该配置会让所有用户的会话在创建后1小时自动过期,无需修改控制器代码,配置简单且全局统一。
方法2:在登录时单独设置会话过期时间
如果不需要全局生效,只想在用户登录时设置当前会话的过期时间,可修改SessionsController的create方法,显式调整会话cookie的过期时间:
# app/controllers/sessions_controller.rb class SessionsController < ApplicationController skip_before_action :authorize, only: [:create] include ::ActionController::Cookies def create user = User.find_by(email: params[:email]) if user && user.authenticate(params[:password]) session[:user_id] = user.id # 将会话cookie的过期时间设置为1小时后 cookies.update(session.instance_variable_get(:@cookie)) do |cookie| cookie.expires = 1.hour.from_now end render json: user else render json: {errors: "检查邮箱和密码"}, status: :unauthorized end end def destroy session.delete :user_id head :no_content end end
可选:用户活跃时自动刷新过期时间
如果希望用户在操作期间保持会话活跃(每次请求都将过期时间延长1小时),可在ApplicationController的authorize方法中添加刷新逻辑:
# app/controllers/application_controller.rb class ApplicationController < ActionController::API include ActionController::Cookies before_action :authorize private def authorize @current_user ||= User.find_by(id: session[:user_id]) if @current_user # 每次验证通过时刷新会话过期时间 cookies.update(session.instance_variable_get(:@cookie)) do |cookie| cookie.expires = 1.hour.from_now end else render json: {errors: "未授权"}, status: :unauthorized end end end
这样用户每发起一次有效请求,会话的过期时间就会重新计算为当前时间+1小时,避免用户在活跃期间被强制登出。
内容的提问来源于stack exchange,提问作者Smeliott
相关产品推荐
相关产品推荐

