AngularJS/Rails移动会话只持续一个小时

use*_*587 7 google-chrome ruby-on-rails angularjs

为什么移动会话持续一个小时但桌面不会过期.

我只是设置cookie:

// app.run
$http.defaults.headers.common['X-CSRF-Token'] = $cookies.get('csrftoken');
Run Code Online (Sandbox Code Playgroud)

这在桌面上工作得非常好(很多个月)但是移动它只能持续约1个小时.为什么会这样?您是否需要在移动设备上设置不同的cookie(在iOS中使用safari和chrome进行测试)?这不是因为用户关闭了标签,因为您可以关闭并重新打开并仍然拥有会话.

最后,这个问题的解决方案是让用户保持30天的登录状态?localStorage的?

ApplicationController

  protect_from_forgery with: :exception
  after_action :set_csrf_cookie_for_ng

  def set_csrf_cookie_for_ng
    cookies['csrftoken'] = form_authenticity_token if protect_against_forgery?
  end
Run Code Online (Sandbox Code Playgroud)

Old*_*Pro 2

如果您没有通过添加Expires=<date>Set-Cookie标头来显式设置浏览器 cookie 的生命周期,则该 cookie 会被视为会话 cookie,并会在浏览器认为会话结束时被丢弃。

大多数桌面浏览器都有一个“从上次中断的地方继续”的选项,该选项可以在运行之间保存和恢复您的会话(和会话 cookie),因此您的会话 cookie 可以在桌面上持续很长时间。我找不到有关 iOS 浏览器的文档,但我怀疑他们只是在认为您“完成”时关闭会话并删除 cookie。

解决方案是显式设置 cookie 的过期日期。由于 iOS 上的 Safari 存在报告问题,我建议还设置 cookie 的域。从 Rails 5.2 开始,您可以使用传递持续时间(以前在Set-Cookie标头中,您必须提供特定的时间戳):

cookies[:name] = {
  value: 'a yummy cookie',
  expires: 1.year,
  domain: 'domain.com'
}
Run Code Online (Sandbox Code Playgroud)

请参阅Rails API 文档以获取更多信息。