CodeIgniter会话类在Chrome中无法正常工作

9

我在CodeIgniter项目中创建了一个登录系统,它在Firefox中运行良好,但在Chrome中却无法正常工作。我已经获取了数据并将其设置为会话(session),但是当代码将控制权重定向到“admin/dashboard”时,我们再次检查会话数据。如果会话数据不存在,则代码将重新将用户重定向到登录页面............ 我的代码如下,我不知道CodeIgniter中的会话/cookie出了什么问题?

        $data = array(
             'user_id' => $user->id,
             'name' => $user->name,
             'user_type' => $user->type,
             'username' => $user->username,
             'is_logged_in' => true
        );

        $this->session->set_userdata($data);
        //echo "user ".$this->session->userdata("username"); exit;
        redirect("admin/dashboard", "location"); 

我已经搜索了很多但是没有人在这种情况下起作用,例如在配置文件中更改cookie_domain但没有任何效果....


你说在火狐浏览器中没问题,那就让我认为你的谷歌浏览器没有存储cookies。请检查一下。 - Bhuvan Rikka
http://stackoverflow.com/q/4268823/984422 - Wahyu Kristianto
但是我的Chrome存储了其他网站的Cookie,比如Facebook等。 - ime.devdesks
@W.Kristianto,我已经检查了所有方法,比如更改cookie_domain名称等,但是什么也没发生... - ime.devdesks
12个回答

19

我也遇到了这种情况,通过将会话过期时间延长到一天来解决它。

更新

为什么通过延长会话过期时间可以解决问题?


这个问题是由用户和Web服务器位置之间的时区差异引起的,比如我住在巴基斯坦,比美国时区快10小时,而我的服务器在美国。我在巴基斯坦时间2012年10月17日14:00请求页面,在美国的时间是2012年10月17日4:00 ,由于会话过期被设置为2小时,服务器发送的cookie被设置为在2012年10月17日6:00到期。现在浏览器与您本地计算机的时间交互,并且得到时间为2012年10月17日14:00,因此它删除了cookie或者您的cookie总是在您的请求时刷新。因此,最好将会话过期时间设置为1天,因为新西兰和美国之间的最大时差为17小时(我不确定时差可能会错),因此您的cookie至少可以保持活动状态7个小时。


1
是的,现在它正在工作,通过将过期时间增加到一天... :) 但是如何在没有这个的情况下管理它,你试过了吗?无论如何,谢谢。 - ime.devdesks
1
这个问题发生在您的时区与Web主机时区不同时,因此1天是安全的。 - Code Prank
@Shayanhusaini 但是当我们使用本地主机时,为什么会遇到这个问题? - Kushal Suthar
@kushalsuthar 我已经在会话中回答了最常见的问题。浏览器设置有许多可能性。 - Code Prank

2
仅提供我的经验,我正在使用Codeigniter 2.1.4,
问题:在Chrome上的会话不超过几分钟,或在执行ajax请求时注销。 我尝试了几种方法:(更改sess_cookie_name,更长的sess_expiration时间)。
我发现将sess_encrypt_cookie设置为FALSE可以解决chrome注销问题。 $config ['sess_encrypt_cookie'] = FALSE;
不确定原因,也许是Chrome上的cookie长度问题(据我所知,加密大大增加了字符串长度)。
我知道加密增加了额外的安全级别,但据我所读,存储在cookie中的数据并不敏感。
希望能有所帮助!

1
我在config.php中将sess_match_useragent参数更改为false。
$config['sess_match_useragent'] = FALSE;

而且谷歌浏览器的问题已经解决。


0

我知道这是一个晚回答,但如果你正在寻找一个好的解决方案,这里有一个:

使用这段代码作为退出登录代码:

$this->session->sess_destroy();

这将确保删除会话“ci_session”,这是您无法保存新会话的主要原因,希望能有所帮助。


0

Shayan Husaini 的答案非常完美。我遇到了同样的问题,通过更改代码解决了它。

$config['sess_expiration'] = 8600;

这是一天中的秒数,而它在两个小时内是多少秒。

$config['sess_expiration'] = 7200;

我住在巴基斯坦,使用美国的服务器,所以出现了这个问题。

谢谢Shayan,你的帮助非常棒。


0

我在编程中遇到了同样的问题,最终通过使用Codeigniter最新版本2.1.4的SQL结构更新sessions数据库表来解决它。

    CREATE TABLE IF NOT EXISTS  `ci_sessions` (
         session_id varchar(40) DEFAULT '0' NOT NULL,
         ip_address varchar(45) DEFAULT '0' NOT NULL,
         user_agent varchar(120) NOT NULL,
         last_activity int(10) unsigned DEFAULT 0 NOT NULL,
         user_data text NOT NULL,
         PRIMARY KEY (session_id),
         KEY `last_activity_idx` (`last_activity`)
    );

还要注意的是,如果在config/database.php文件中配置了多个数据库,会话表将使用默认配置数据库的会话表。

0
解决了,CodeIgniter在指定cookie域名为localhost时存在问题,我在hosts文件中设置了一个伪造的域名,使其符合真实域名的结构,然后问题得到解决。

0

如果您的服务器PHP版本是7.x,请将其更改为5.6,这对我有效。


0

我曾经遇到过同样的问题,通过修改 CodeIgniter 框架下 /application/config/config.php 中的 $config['sess_time_to_update'] = 3; 值,我成功解决了这个问题。


0

我之前也遇到了同样的问题。但是我通过在 $config['cookie_path'] 中设置正确的值来解决了它。如果你的项目是从你的域名的子文件夹中运行的,那么请将子文件夹的名称设置为 $config['cookie_path'] 的值;

假设你的项目 URL 是:https://example.com/demo1/ 那么 $config['cookie_path'] 应该像这样 $config['cookie_path'] = '/demo1/'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接