Codeigniter会话因Ajax调用而出错

我的CodeIgniter应用程序使用会话库并将数据保存到DB。


我遇到了一些问题,在某个ajax调用之后创建空白会话。


经过调查,似乎触发了两个同时进行的函数调用,需要进行会话验证。一个会失败,另一个会没事。


我能够通过不让它们同时启动来解决此问题。但是我仍然不明白为什么它会失败。它与更新用户cookie的一次调用和使第二次调用无效的调用有关吗?还是在读取数据库时以某种方式死亡?


我稍微看了一下Session核心类,却没有找到任何线索。


如果有人遇到相同的问题,我将不胜感激如何调试或引起问题的任何建议。


谢谢!


编辑:


我最初说的是408状态返回。那是无关的案件。


这是并行触发MyVar.refresh()的函数:


function (event)

{

    var self$ = this.a$;

    var uid  = this.b$.val();

    var tid  = this.c$.val();

    var jqxhr = $.post('/controller1/index',{'uid':uid,'tid':tid,'action':true},function(re)

    {

        if(re.message != 'success')

        {

            MyVar.alert('<span class="msg_error sprite"></span>' + re.error);

            MyVar.refresh();

        } 


    },'json');

    MyVar.refresh();

    return stopDefault(event);

};

可能的解决方案:


找到了这个:http : //codeigniter.com/forums/viewthread/102456/


显然,它不能与Ajax配合使用。一种解决方案是如果是ajax调用则禁止会话更新。唯一的问题是我们的网站主要是用Ajax构建的。


另外,只需将sess_time_to_update降低到非常频繁的水平,而ajax可以正常运行。浏览器也进行了刷新,并且没有超时。不确定为什么ajax调用后会话ID是否已更改并且浏览器cookie从未更新过。


缥缈止盈
浏览 502回答 3
3回答

慕的地6264312

尝试这个<?php/**&nbsp;* ------------------------------------------------------------------------&nbsp;* CI Session Class Extension for AJAX calls.&nbsp;* ------------------------------------------------------------------------&nbsp;*&nbsp;* ====- Save as application/libraries/MY_Session.php -====&nbsp;*/class MY_Session extends CI_Session {&nbsp; &nbsp; // --------------------------------------------------------------------&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* sess_update()&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp;* Do not update an existing session on ajax or xajax calls&nbsp; &nbsp; &nbsp;*&nbsp; &nbsp; &nbsp;* @access&nbsp; &nbsp; public&nbsp; &nbsp; &nbsp;* @return&nbsp; &nbsp; void&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public function sess_update()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $CI = get_instance();&nbsp; &nbsp; &nbsp; &nbsp; if ( ! $CI->input->is_ajax_request())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent::sess_update();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}// ------------------------------------------------------------------------/* End of file MY_Session.php *//* Location: ./application/libraries/MY_Session.php */问题出在会话类的sess_update函数中,该函数在X秒后生成一个新的session_id。每个页面都有一个session_id,如果session_id在进行ajax调用之前过期,则该调用将失败。在/ application / libraries /中创建一个名称为MY_Session(或您设置的前缀)的php文件,将此代码粘贴在那里。该函数将覆盖会话类中的sess_update函数,检查每个请求是否由ajax发出,跳过sess_update函数。将sess_expiration设置为更高的值是一个坏主意。这是一项安全功能,可防止您受到会话干扰PD:我的英语不太流利,如果您听不懂,请告诉我。

偶然的你

在将其合并到稳定分支之前,解决方案(最终!)是将Areson的提交245bef5与数据库模式结合使用:CREATE TABLE IF NOT EXISTS&nbsp; `ci_sessions` (&nbsp; &nbsp; session_id varchar(40) DEFAULT '0' NOT NULL,&nbsp; &nbsp; ip_address varchar(45) DEFAULT '0' NOT NULL,&nbsp; &nbsp; user_agent varchar(120) NOT NULL,&nbsp; &nbsp; last_activity int(10) unsigned DEFAULT 0 NOT NULL,&nbsp; &nbsp; user_data text NOT NULL,&nbsp; &nbsp; prevent_update int(10) DEFAULT NULL,&nbsp; &nbsp; PRIMARY KEY (session_id),&nbsp; &nbsp; KEY `last_activity_idx` (`last_activity`));有关更多信息,请从上至下阅读拉1283注释。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JQuery