Rails Rails 5.1.3 API 模式中,如何将 session 存在本地内存中?

Freeman1990 · 2017年08月24日 · 最后由 Freeman1990 回复于 2017年08月24日 · 2123 次阅读

新手, 在 rails API 模式使用中遇到了一个问题。

想将 session 的信息存在本地缓存中, 自己也新建了

config/initializers/session_store.rb 

并填写了内容

Rails.application.config.session_store :cache_store, key: '_test_api_session'

但是我在使用中 设置了 session["test"] = 123 后, 在其他类的方法里 通过 session["test"] 无法获取到 123, 在查看 session 为空。

不知道是哪里设置的不对还是我理解的不对。

求解答。 不知道问题有没有描述清楚....

----------------------------update ---------------------------------

找到了解决办法。 上午找了一上午没找到, 这会一会就找到了。

参考了 https://stackoverflow.com/questions/15342710/adding-cookie-session-store-back-to-rails-api-app 中的解决办法。

原因 是因为 Rails API-only 模式 并不支持 cooke 与 session 这些, 需要手动添加支持。

添加方法是在 config/application.rb 中追加 下面这两段

config.middleware.use ActionDispatch::Cookies                                                                        
config.middleware.use ActionDispatch::Session::CookieStore, key: '_test_api_key'

然后根据我上面说的, 创建那个文件指定是哪种方式, 默认是 cooke 存储 session。 如果你有别的需要,可以对其修改, 支持本地、Active_record 以及 memcache 等的存储。

好了, 结帖了。

API 模式应该默认没加载 session 中间件。

Session 需要 cookies,API 不假设客户端支持 cookie,所以应该用别的机制保存用户状态。

最简单的是一种 token Auth , 就是用户登录在后,后端返回一个 token,然后每次访问 User scope 的时候,在 header 里面带入这个 user 对应的 token。对应的要设置 token 的过期时间,和登出删除 user 的 token

Rei 回复

额, 可能是这个原因,请问需要在 config/application.rb 中设置么? 找了 rails 手册也并没有看到相关设置...

ForrestDouble 回复

嗯,这种方式也可以实现。 但是我这情况有点特殊, 不是咱们标准的服务, 有些东西由前端传递给我。

我的理解(可能有误差)。 就是我选择了 cache_stroe 模式了, 我的 session 信息应该就不受客户端 response 里的 cookie 影响了。 因为所有 session 都存在了缓存(内存)中。 但是我的实际操作情况与预想的有差别。 即 session 为空。。。

@ForrestDouble @Rei 看了下这篇 https://ruby-china.org/topics/26212 , API 模式禁用了 session... 我再找找有方法加载这个 middleware 。

猜测你这个应用不大,可以试试 Sinatra

hww 回复

嗯, 之前考虑过 sinatra。 一是 ruby 的菜鸟, 二也是 web 框架的菜鸟。 sinatra 也需要组织结构、 配合 ORM 加载 log 库等等。 图省事选了 rails 的 api。。。

Freeman1990 关闭了讨论。 08月30日 14:08
需要 登录 后方可回复, 如果你还没有账号请 注册新账号