我注意到一种奇怪的行为。我正在尝试通过SessionsController的自定义操作注销用户,然后在JS中重定向用户以登录页面。我的应用程序部署在负载均衡器后面的AWS上。
以下是相关的 session Controller 和javascript代码。

  def inactivity
    user_signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(:user))
    flash.now[:alert] = 'Logged out due to inactivity.'
    flash.keep(:alert)
    if user_signed_out
      head :ok
    else
      raise "User could not be logged out."
    end
  end
Session.inactivity().then(function() {
Turbolinks.visit('/users/sign_in');
})
我看到在某些情况下,虽然在inactive方法中,我已登录并重定向到主页,而不是将用户重定向到登录页面,但我使用sign_out(user)。
我检查了日志,发现在这种情况下,sign_out由一台服务器处理,而重定向到sign_in的请求由另一台服务器处理。
可能是一台服务器不知道用户已注销,因此用户被重定向到主页吗?
有什么可能解决这个问题?
谢谢。

最佳答案

如果您使用了错误的 session 存储,则服务器将不知道来自其他后端服务器的 session 。对我来说,您似乎应该使用ActiveRecordStore。然后将 session 数据存储在数据库中。对于
更多信息,请参见https://guides.rubyonrails.org/action_controller_overview.html#session
Does Ruby on Rails ActiveRecordStore work with load balancing across servers?

09-17 16:27
查看更多