Php CodeIgniter 3,AJAX问题

Php CodeIgniter 3,AJAX问题,php,ajax,codeigniter,session,Php,Ajax,Codeigniter,Session,这里我们讨论的是带有AJAX调用和会话的PHP CodeIgniter应用程序 大家好 在发布这篇文章之前,我在网上做了一些搜索 配置: 使用加密cookie的数据库存储会话 编码点火器3.1.10 jQuery 3.1.1 PHP 5.6或7.x(同一版本) Localhost:会话或其他方面没有问题 OVH mutualise server(共享):有时它会丢失会话,这不是同一时间,我认为这是服务器端配置,但我想知道你们中的一些人是否也遇到过这个问题 问题是,如果会话丢失并出现以下错误,

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

大家好

在发布这篇文章之前,我在网上做了一些搜索

配置:

  • 使用加密cookie的数据库存储会话
  • 编码点火器3.1.10
  • jQuery 3.1.1
  • PHP 5.6或7.x(同一版本)

  • Localhost:会话或其他方面没有问题

  • OVH mutualise server(共享):有时它会丢失会话,这不是同一时间,我认为这是服务器端配置,但我想知道你们中的一些人是否也遇到过这个问题
问题是,如果会话丢失并出现以下错误,AJAX调用将无法完成:

事实上,JSON无效

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

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

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

对于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请求执行“适当的技巧”
    • 试试这个

      控制器:

      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();
          }
      }
      
      阿贾克斯:


      对isLogged函数的私有函数isLogged(){if(!$this->session->userdata('connected')){if($this->input->is_ajax_request()){echo json_encode(['error'=>true,'message'=>'session lost']);exit()}else{redirect('user/login');}}}}}}你好,啊,没有想到是对codeigniter的请求。我会尝试一下,看看会发生什么,事实上,在“url”中调用的控制器仅为AJAX,因此不会为加载视图或其他内容调用它。检查此CI用户指南您好,谢谢您的回答,我将测试并查看。但为什么要更改ajax请求的类型(POST>GET),是否有任何链接?就像我说的,解决方案有时候是你没有想到的小事情,哈哈。这很奇怪,因为有时候这个条件:$此->会话->用户数据(“已连接”)已填充,但会话数据仍在此处。。。所以它不会每次都这么做!
      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);
              }
          });