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

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

新手,在 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号