【问题标题】:CodeIgniter 3, AJAX issueCodeIgniter 3,AJAX 问题
【发布时间】:2019-11-29 11:16:13
【问题描述】:

这里我们讨论的是带有 AJAX 调用和会话的 PHP CodeIgniter 应用程序。

大家好!

我在发布之前在网络上进行了一些搜索。

配置:

  • 带有加密 cookie 的数据库存储会话
  • CodeIgniter 3.1.10
  • jQuery 3.1.1
  • PHP 5.6 或 7.x(相同问题)

  • 本地主机:会话或任何东西都没有问题

  • OVH 相互化服务器(共享):有时它会丢失会话,不是同一时间,我认为是服务器端配置,但我想知道你们中的一些人是否也遇到过这个问题??

问题在于,如果会话丢失并出现以下错误,AJAX 调用不会完成:

JS error

事实上,无效的 JSON。

在 phpinfo() 中,cookie 的服务器端文件生命周期为 0,我认为 OVH 共享服务器有时会更新会话,但这不是固定时间。

对于“正常”导航(加载视图的控制器/方法),检查正常,如果会话丢失,应用程序将用户重定向到登录页面。

我正在使用一个配置良好的专用服务器,当服务器正常时,这个问题将得到解决(使用 NodeJS 服务使用 CodeIgniter 4 迁移和返工)但我对这个问题很好奇...

// Working for navigation
private function isLogged() {
    if (!$this->session->userdata('connected')) { 
        redirect('user/login');
    }
}

对于 AJAX 调用,它是......嗯......我尝试了一些技巧来“处理”这个问题,比如 AJAX 调用:

// Not working on AJAX calls
private function ajaxIsLogged() {
    if (!$this->session->userdata('connected')) { 
        echo json_encode(['error' => true, 'message' => 'Session lost']);
        return false;
    }
}

这里是一个 AJAX 调用的例子

    $.ajax({
        type: 'POST',
        url: url,
        data: data,
        beforeSend: function () {
            $("div#divLoading").addClass('show');
        },
        complete: function () {
            $("div#divLoading").removeClass('show');
        },
        success: function (res) {
            // In my case when the issue occurs, ISSUE is HERE
            // Trying to parse non-valid JSON
            // But I don't understand why server would echo something
            // The function isAjaxLogged would normally do the trick
            var result = JSON.parse(res);

            if (result.error) {
                console.log(result.error);

                // Here we can redirect to login page if ajaxIsLogged() was working
            }

            if (result.success) {
                // Do things
            }
        }, error: function (err) {
            console.log(err);
        }
    });

我在没有 JSON.parse 的情况下尝试了很多事情,但仍然出现错误(没有 JSON.parse 时不完全相同,但错误总是在我的控制函数之前发生,享受异步 :))

感谢您阅读本文,如果您遇到这个问题? 我对 CI / Sessions / Ajax 感到头疼,有时解决方案只是一件小事。

总结一下:

  • 有没有办法通过 CI 共享/互斥服务器上的会话作弊?
  • 有没有办法在会话丢失时对 AJAX 请求执行“适当的技巧”?

【问题讨论】:

  • 试试这个你的 isLogged 函数 private function isLogged() { if (!$this->session->userdata('connected')) { if($this->input->is_ajax_request() ) { echo json_encode(['error' => true, 'message' => '会话丢失']);出口(); } else { 重定向('用户/登录'); } } }
  • 你好啊,没想到codeigniter的is_ajax_request。我会试试这个,看看会发生什么,
  • 事实上,在“url”中调用的控制器只是AJAX,所以它不会被调用来加载视图或其他东西。
  • 查看此 CI 用户指南 codeigniter.com/user_guide/libraries/…

标签: php ajax codeigniter session


【解决方案1】:

试试这个,

控制器:

function ajaxIsLogged() {
    if (!$this->session->userdata('connected')) { 
        echo json_encode(['error' => false, 'message' => 'Session lost']);exit();
    }else{
        echo json_encode(['error' => true, 'message' => 'Session exists']);exit();
    }
}

阿贾克斯:

$.ajax({
        type: 'GET',
        url: url,
        beforeSend: function () {
            $("div#divLoading").addClass('show');
        },
        complete: function () {
            $("div#divLoading").removeClass('show');
        },
        success: function (res) {
            console.log(res);
        }, error: function (err) {
            console.log(err);
        }
    });

【讨论】:

  • 您好,感谢您的回答,我将对此进行测试并查看。但是为什么要更改 ajax 请求的类型(POST > GET),有链接吗?就像我说的,解决方案有时是你没想到的小事,哈哈。
  • 这很奇怪,因为有时这种情况: !$this->session->userdata('connected') 已填充但会话数据仍然存在......所以它不会成功每次!
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 2011-11-22
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多