V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sensui7
V2EX  ›  问与答

想问问关于 php 退出登录时的 sesssion 问题

  •  1
     
  •   sensui7 · 2016-01-24 17:47:41 +08:00 · 1831 次点击
    这是一个创建于 3213 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在退出时, 清除 session, 清楚 cookies, 然后重建 session, 写入一些信息, 重定向到首页.

    然而重建 session 之后, 新的 session id 并没有发送到客户端, 重定向到其他页面后, 由于没有 session id, 就会自动重建新的 session, 这样之前写入的信息就没有了.

    一个很二的解决办法是在重定向之前, 刷新一下浏览器, 这样客户端就得到 session id 了.

    我想问问, 这个要如何解决? 我看了一些其他的 codeigniter 用户模块的库文件, 发现好像并没有什么特别的地方, 难道是我写的程序逻辑有问题吗?
    第 1 条附言  ·  2016-01-24 19:35:22 +08:00
    public function logout()
    {
            $this->my_auth_lib->logout();
            $this->session->set_flashdata('alert','You have been logged out!');
    //     不跳转, 刷新一次就可以保存 session id 到 cookies 中
            redirect('index');
     }
    

    代码是上面这样的, 如果把 redirect 注释掉, 然后此时刷新一次, session id 就会保存到 cookies 中, 如果加上 redirect, 跳转到首页后, 会创建一个新的 session, 里面并没有 flashdata.

    请教各位大神如何处理这个问题?

    8 条回复    2016-01-25 15:08:12 +08:00
    haiyang416
        1
    haiyang416  
       2016-01-24 18:01:31 +08:00 via Android
    登录后写入的 session 内容是什么?可以保留 session id 只清空需要移除的内容
    sensui7
        2
    sensui7  
    OP
       2016-01-24 18:20:56 +08:00
    @haiyang416 倒也没什么敏感的东西, 这确实是个办法, 但是这个问题碰到了, 不解决, 很闹心. 我折腾挺长时间了,
    sensui7
        3
    sensui7  
    OP
       2016-01-24 19:37:19 +08:00
    大神救我
    haiyang416
        4
    haiyang416  
       2016-01-24 21:17:38 +08:00 via Android
    @sensui7 session id 对于客户端来说也是一个 cookie,对 http 协议来说只是一个 header ,重定向也只是一个 header ,所以你只需要在服务端重新生成一个 Sid ,然后以 header 发送到客户端即可。
    guoer
        5
    guoer  
       2016-01-24 21:42:07 +08:00   ❤️ 1
    redirect('index');前加个
    ```
    header('set-cookie:' . session_id());
    ```
    试试
    ChoateYao
        6
    ChoateYao  
       2016-01-24 21:53:39 +08:00   ❤️ 1
    这个问题有一个解决方案,就是你`logout`之后会清除各种`session`,那么你在重新给 session 赋值的时候,顺便刷新 session_id ( session_regenerate_id )就可以解决这个问题了。

    这是 PHP 本身的问题。
    micate
        7
    micate  
       2016-01-24 23:15:16 +08:00
    如果信息量很小且没有敏感性,可以附加到跳转的 URL 中,在跳转到的地方从 URL 中获取。
    sensui7
        8
    sensui7  
    OP
       2016-01-25 15:08:12 +08:00
    @guoer 这方法好使, 后续访问页面, 会添加一个额外的键名为空的 cookies, 值为 session id

    @ChoateYao perfect. 完美的解决了, 只需要 session_regenerate_id()就可以了, 一直忽略了这个函数能发送新 id 的功能. 总是把它当成一个生成 id 的函数. 感谢.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2676 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.