vale888 发表于 2008-11-6 17:08:16

[原创]简单修改,让CI自带的session类支持浏览器关闭自杀

我不知道这个论坛有没有人这么修改过,我没找到,所以发表下!

都知道CI自带的session类默认是依靠php的cookie储存的,
其实cookie储存是有很多弊端的,大小限制,还有安全问题,所以非必要最好使用第三方session类库!
我使用他主要是因为我做的这个项目涉及到跨域的问题,所以我决定使用CI自带的session类!
可是很多人都发现了CI自带的session类不会随浏览器自杀,即使你把期限设置为0,他就变成永久!囧!
我看论坛也有很多人问,所以就简单修改下,让他支持随浏览器自杀!

复制一个Session.php到你程序目录里的libraries目录下,

修改行108-118:

                if (is_numeric($expiration))
                {
                        if ($expiration > 0)
                        {
                              $this->sess_lengths = $this->CI->config->item('sess_expiration')+time();
                              $this->sess_length = $this->CI->config->item('sess_expiration');
                        }
                        else
                        {
                              $this->sess_lengths = 0;
                              $this->sess_length = (60*60*24*365*2);
                        }
                }

多加一个变量的原因就是因为这样简单,而不需要去修改其他的$this->sess_length

修改行310-317:

                setcookie(
                                        $this->sess_cookie,
                                        $cookie_data,
                                        $this->sess_lengths,      
                                        $this->CI->config->item('cookie_path'),
                                        $this->CI->config->item('cookie_domain'),
                                        0
                              );


这样子就可以了!
只要在config.php中设置$config['sess_expiration'] = 0;
session就会随浏览器自杀了!

如果不是特殊需要,还是推荐使用其他第三方session类库!

[ 本帖最后由 vale888 于 2008-11-6 17:12 编辑 ]

kissmumu 发表于 2008-11-6 17:21:32

嗯,支持一个。:)

gokure 发表于 2008-12-30 16:49:34

看来你这个不是1.7的啊

moonster 发表于 2008-12-30 17:26:22

1.7的可以自杀吗,呵呵

yz20sui 发表于 2009-1-11 14:28:29

1.7版本 不可以使用上面的办法 但是换汤不换药 其实要明白LZ说的意思 1.7 修改也不难

复制 session.php 到libraries下面

修改

89行

if ($this->sess_expiration == 0)
                {
                        $this->__s_length = 0;
                        $this->sess_expiration = (60*60*24*365*2);
                }
else
                {
                        $this->__s_length = $this->CI->config->item('sess_expiration')+time();
                }


找到 function _set_cookie($cookie_data = NULL) 这个方法

将 setcookie 这个操作修改为下面
setcookie(
                                        $this->sess_cookie_name,
                                        $cookie_data,
                                        //$this->sess_expiration + time(),
                                        $this->__s_length,
                                        $this->cookie_path,
                                        $this->cookie_domain,
                                        0
                                );

经过测试 可以自杀 不过会不会对 写入数据库型的session保存方案有没有影响 还没测试

final 发表于 2009-1-12 12:37:19

数据库型的session保存方案好像不行的。有没有清除的方法啊?

ahkxhyl 发表于 2010-11-1 17:40:03

;P谢谢。。。。

ahkxhyl 发表于 2010-11-3 09:45:38

谢谢。。。:$

longjianghu 发表于 2010-11-17 20:29:38

:)好文收藏了

muyeyifan 发表于 2011-12-8 22:49:10

remark一下
页: [1]
查看完整版本: [原创]简单修改,让CI自带的session类支持浏览器关闭自杀