V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oncew
V2EX  ›  程序员

session 一般是保存在什么地方?

  •  
  •   oncew · 2016-11-25 22:09:20 +08:00 · 9236 次点击
    这是一个创建于 2701 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不考虑那种将 session 保存到 redis 、 memache 这种持久化的方案。

    一般的 web 框架是通过什么方式来保存 session 的? session ,我理解的与应用程序启动,存放在开辟的一块内存空间,但是为什么应用服务重启之后, session 信息会还在?

    最近遇到的一个问题, web 进程结束了,过了一段时间重启,客户端不需要重新登陆,仍然可以使用上次的 cookie 来登陆。检查结果发现是上次 session 还在,没有随着服务关掉而清除,但是 session 一般不是保存在内存里面的?随进程结束,也应该会被回收?

    申明,用的是 web 框架自带的 session 处理机制,没有用第三方服务( redis 、....)将 session 保存,也是用的单机测试的,没有集群。。。
    14 条回复    2016-11-26 20:27:06 +08:00
    letitbesqzr
        1
    letitbesqzr  
       2016-11-25 22:15:03 +08:00
    不同框架 不同容器 都可能存在不同的地方
    shinwood
        2
    shinwood  
       2016-11-25 22:16:40 +08:00
    PHP 的 session 一般是保存为文件的…
    Zzzzzzzzz
        3
    Zzzzzzzzz  
       2016-11-25 22:29:28 +08:00
    不用多想, 找个带多后端封装的 session 实现就明白了, 一般就是硬盘文件、 memcached 、 redis 、数据库、 主容器的内存、客户端加密的 cookie
    Ouyangan
        4
    Ouyangan  
       2016-11-25 22:30:25 +08:00
    拿 java tomcat 举例 ,运行时 session 是在内存中的,说白了就是一个 concurrentHashmap ,正常关闭和重启会有序列化写入文件的机制, 但是直接杀掉是不会序列化 session 到文件的.
    murmur
        5
    murmur  
       2016-11-25 22:34:56 +08:00
    小的用默认实现 大的要上到 redis 或者 memcache 里
    cxbig
        6
    cxbig  
       2016-11-25 23:58:35 +08:00
    框架一般都是写文件或数据库的,要特别配置才会和 redis 、 memcached 等缓存机制挂钩
    你这个情况先检查缓存文件文件夹,再检查数据库表,应该能找到 session 的存放点
    pathbox
        7
    pathbox  
       2016-11-26 01:14:49 +08:00
    很多地方都可以保存 文件 cookie redis 内存等
    oncew
        8
    oncew  
    OP
       2016-11-26 08:17:20 +08:00
    @cxbig 我以为 session 是随着 web 框架一起运行在内存中,关闭服务就会将 session 清空,没料到 web 框架会有自动将 session 序列化到本地文件的机制 --
    oncew
        9
    oncew  
    OP
       2016-11-26 08:29:50 +08:00
    @shinwood php 默认保存到文件,一般是会缓存到本地文件, web 框架一般会将它存到本地硬盘什么地方?
    jessynt
        10
    jessynt  
       2016-11-26 09:59:45 +08:00
    @oncew

    框架一般都会有配置的吧,如果没有提供,应该保存在 php.in 里面配置的路径

    q397064399
        11
    q397064399  
       2016-11-26 10:03:43 +08:00
    楼主是用的 JavaEE 吧
    Servlet 规范里面 有这个接口,
    HttpSessionActivationListener 配置到 web.xml 里面你就可以看到 Session 的持久化跟激活了
    q397064399
        12
    q397064399  
       2016-11-26 10:10:47 +08:00
    Tomcat 也提供自定义的 SessionManager 管理器
    jimzhong
        13
    jimzhong  
       2016-11-26 15:53:03 +08:00
    Session 可以存在服务端或者客户端。
    如果存客户端就是用 cookie ,要加密并签名,只建议在非关键场合使用。此时要配置一个 SESSION_KEY ,只要 key 不变,用户 cookie 没过期,即使服务器重启 session 也不丢。
    如果存服务端可以放在文件里,放关系数据库里,放 redis 里。然后给用户分配一个随机的 sessionid ,用这个 id 取 session 。我比较喜欢放 redis 里,性能会好一些吧。
    oncew
        14
    oncew  
    OP
       2016-11-26 20:27:06 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5368 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 09:00 · PVG 17:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.