Rails 关于用户登陆中的 UserSession 问题?

jarorwar · 2013年08月28日 · 最后由 jarorwar 回复于 2013年08月29日 · 3829 次阅读

为什么 rails 在用户登陆的时候要把session作为一个资源来存到数据库里呢?是因为 rails 没有类似 java 的 httpsession 这个东西吗?如果在线活动用户特别多,存到数据里效率应该很低下把~!新手问题,求解答。先谢谢了~!

谁说要存数据库里的?

#1 楼 @libuchao 好把。我看到可以存在文件里的,但是我看到很多的例子都是存在数据库里的

#1 楼 @libuchao 不是说,如果 session 带有大量信息的话,存文件会有问题么?

可以看看 config/initializers/session_store.rb

这里定义了用什么存 session 默认的是基于 cookie

#2 楼 @jarorwar Rails 没有要求存数据库里,也没有存文件里。session 基本和其他语言一样用,如果写程序的人硬要存数据库或文件里,那你拦也拦不住

#5 楼 @libuchao 好的。。你不要兰我了。哈哈

#4 楼 @davidqhr 是啊,客户端总要存一个 session id,要么存 cookie 里,要么放 URL 里。

#7 楼 @libuchao 我说的是服务端的数据,客户端存的只是 sessionid,况且这个 id 只能放在 cookie 里把?

#8 楼 @jarorwar 我明白,总之 rails 没有要求说要存数据库,如果没有特殊原因的话也不建议这样做。关于 session id 如果客户端禁用了 cookie 呢,虽然很少见,这时候 session id 可以放 URL 里。你可以看一下登陆网易邮箱后的 url

#9 楼 @libuchao 哦。它会提示你打开 cookie 的。 All session stores use a cookie to store a unique ID for each session (you must use a cookie, Rails will not allow you to pass the session ID in the URL as this is less secure). 这里是 rails 的解释

#10 楼 @jarorwar 呵呵,看来 Rails 限制更为严格,毕竟用户禁用 cookie 的概率极低,可以忽略。

你可以看看自己项目里的config.session_store设置 一般情况开发环境是存数据库 便于你不用每次重启服务都要重新登陆 同时又没有什么并发 生产环境一般都是存 memcached~

#12 楼 @zj0713001 你的回答才是我思考的答案啊。谢谢。我现在想存 redis,不知道怎么弄?

#13 楼 @jarorwar Session 数据就存 cookie 里,从效率到安全性都没有什么大问题,绝大多数 Rails App 都是这么干的。 如果只存在 cookie 里,有一个问题:你不知道当前在线的用户有哪些,解决方法是,在 session (cookie) 里存一个 session_id,以 session_id 为 key 把你想要跟踪的数据放在 redis 或 memcached 就可以了,比如把 user_id 和 last_access_time , last_access_page 信息放在里面。这样就从这些数据里就知道当前在线用户的信息了。

#14 楼 @vincent 谢谢了。但是如果用户离开了呢?我如何清 redis 的数据(他根本就没有执行注销这个动作)

#15 楼 @jarorwar 方法 1:可以为 redis 里的数据设置过期时间,比如设置 30 分钟,如果 30 分钟内用户未访问,无论有无注销动作,数据会被 redis 删掉。 方法 2:redis 不设置过期时间,后台跑一个定期任务(每分钟),把最后访问时间超过过期时限的数据删除掉,当然可以在删除前做一个模拟注销处理过程。

#15 楼 @jarorwar 传送门 https://github.com/redis-store/redis-store 你上面说的 存 session 的意义就在于用户离开了再次回来的时候还能保持登陆或者拿到其他信息 我们生产环境是从来不清 memcached 的 保存时间是一个月~ 用户一个月不来就木有了~ 你的 redis 也可以设置过期时间的 到时候自动就木有了

#17 楼 @zj0713001 well.如果用户是在网吧上网。这个 cookies 一直存着会不会很危险~!redis-store 收下了 再次谢过

#18 楼 @jarorwar 你前端给个选项... 是不是记住登陆 默认是不记住...

#19 楼 @zj0713001 ok 谢谢。就这么着了。我想复杂了。哈哈

#20 楼 @jarorwar devise 解决一切...

#21 楼 @zj0713001 devise 看了。想定制困难。比如说要限制用户注册。只有管理员才可以加人。另外注册需要有邀请码。之类之类的。。不过 devise 确实很好好啊

#22 楼 @jarorwar 都能的 但是定制的时间比自己写一个可能用的时间还多... 所以推荐把 devise 吃透了(我反正是放弃了 我只吃透了一小部分)再定制就飞快了

#23 楼 @zj0713001 我研究了一天,云里雾里的。所以就放弃了。本来想用别的 gem 的,但是发现,我根本就不需要发邮件,让用户找回密码这些功能。所以。我就自己写了。哈哈

#23 楼 @zj0713001 个人觉得,在能力和时间允许的范围内好好研究下 devise,还是非常值得的~!

#24 楼 @jarorwar 哇哈哈 发邮件找回密码的功能是可以关掉的... 嘿嘿~

#26 楼 @zj0713001 把你的研究成果发出来 让我站在巨人的肩上啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号