为了账号安全,请及时绑定邮箱和手机立即绑定

Codeigniter会话因Ajax调用而出错

Codeigniter会话因Ajax调用而出错

哆啦的时光机 2019-12-13 15:10:56
我的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从未更新过。
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

尝试这个


<?php

/**

 * ------------------------------------------------------------------------

 * CI Session Class Extension for AJAX calls.

 * ------------------------------------------------------------------------

 *

 * ====- Save as application/libraries/MY_Session.php -====

 */


class MY_Session extends CI_Session {


    // --------------------------------------------------------------------


    /**

     * sess_update()

     *

     * Do not update an existing session on ajax or xajax calls

     *

     * @access    public

     * @return    void

     */

    public function sess_update()

    {

        $CI = get_instance();


        if ( ! $CI->input->is_ajax_request())

        {

            parent::sess_update();

        }

    }


}


// ------------------------------------------------------------------------

/* 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:我的英语不太流利,如果您听不懂,请告诉我。



查看完整回答
反对 回复 2019-12-14
?
倚天杖

TA贡献1828条经验 获得超3个赞

在将其合并到稳定分支之前,解决方案(最终!)是将Areson的提交245bef5与数据库模式结合使用:


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,

    prevent_update int(10) DEFAULT NULL,

    PRIMARY KEY (session_id),

    KEY `last_activity_idx` (`last_activity`)

);

有关更多信息,请从上至下阅读拉1283注释。



查看完整回答
反对 回复 2019-12-14
  • 3 回答
  • 0 关注
  • 377 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信