【问题标题】:CodeIgniter is not saving session trough AJAXCodeIgniter 没有通过 AJAX 保存会话
【发布时间】:2018-03-25 01:05:24
【问题描述】:

我有一个问题希望你能帮助我。我的控制器中有一个创建 CodeIgniter 会话的方法。为了确保创建正确,我在创建会话后执行print_r() 函数。然后,在我的 Ajax 请求中,我输入了 location.reload 来刷新页面。

这就是我的方法:

public function CreateSession() {
   $response = $this->mymodel->registerUser();
   //The response in this case of the method registerUser() is an array such as:
   /*
   Array
    (
       [id_web_user] => 982
       [nombre_web_user] => name
       [apellidos_web_user] => lastname
       [user_mail] => asf21@gmail.com
       [user_password] => 202cb962ac59075b964b07152d234b70
       [id_pais] => 1
       [profile_picture] => n/a
       [id_seccion_registro] => 1
       [id_estatus] => 0
       [id_usuario_alta] => 1
       [id_usuario_mod] => 1
       [fecha_ultimo_ingreso] => 2018-03-25 01:43:17
       [fecha_alta] => 2018-03-25 01:43:17
       [fecha_modificacion] => 2018-03-25 01:43:17
    )
    */

    //Then when I get the response array, I create a new array which contains an specific data for store in a session within userdata like:

    $newdata = array(
        'id_web_user' => $response['id_web_user'],
        'nombre_web_user' => $response['nombre_web_user'],
        'apellidos_web_user' => $response['apellidos_web_user'],
        'user_mail' => $response['user_mail'],
        'profile_picture' => $response['profile_picture']
    );

    //Finally I create the session:
    $this->session->set_userdata($newdata);

    //And then, wheter I do a print_r($this->session->userdata) for verify that the session was created successfully, I get something like:
    /*
    Array
    (
       [__ci_last_regenerate] => 1521938249
       [id_web_user] => 983
       [nombre_web_user] => name
       [apellidos_web_user] => lastname
       [user_mail] => asf21@gmail.com
       [profile_picture] => n/a
    )
    */

   //In this step I do an echo 1; because my Ajax request is waiting for that and make a "location.reload()", so:
   echo 1;
}

这个方法通过Ajax调用,比如;

//base_url was defined previously
$.ajax({
   type : "POST",
   url : base_url + "/mycontroller/CreateSession",
   data : {},
   success : function(response) {
      if ( response == 1 ) {
        location.reload();
     }
   }
});

所以,最后,在 Ajax 请求中,我执行 location.reload,但是当页面刷新时,这会将我重定向到 http://localhost/,并且当我想检查包含 $this->session->userdataprint_r($this->session->userdata); 的内容时,这是空的。

我做错了什么?我试图找到一个解决方案,有人说 CI 的 Session.php 有一个错误,需要替换 CI 的 Github 中存在的新的。其他人说这是 cookie 的问题,因为当会话包含超过 4KB 时,它会自动擦除。这太疯狂了,我希望你能帮助我。非常感谢您的支持。

【问题讨论】:

  • 你是否在config.php上设置了会话保存路径不要让它为空。
  • 你使用的是 ci 2 对吗?
  • 在所有启用 session.autostart with 1 之后问题就解决了

标签: javascript php ajax codeigniter


【解决方案1】:

你是否称这个库为 $this->load->library('session');

或者在 application/config/autoload 中调用这个库。 php 文件使用... $autoload["libraries"] = array("session" ) ;

【讨论】:

  • 是的,我已经放入我的控制器 $this->load->library('session');在我的 autoload.php $autoload["libraries"] = array("session") ;
  • 如果你把自动加载然后它不需要调用控制器。如果它像这样包含,它将调用两次
  • 在任何情况下都不会导致这样的问题。 ci 已经有机制来防止两次加载同一个类。
【解决方案2】:

感谢您的回答。我解决了我的问题,但有一些限制。似乎CodeIgniter无法在会话的数组中存储大量数据,所以我以官方文档中存在的创建会话为例。

我的例子来自:https://www.codeigniter.com/user_guide/libraries/sessions.html#adding-session-data

    $newdata = array(
            'username'  => 'johndoe',
            'email'     => 'johndoe@some-site.com',
            'logged_in' => TRUE
    );

    $this->session->set_userdata($newdata);

因此,通过上面的代码示例,我构建了一个新的自定义会话。然后,我修改了我之前的代码部分:

$newdata = array(
    'id_web_user' => $response['id_web_user'],
    'nombre_web_user' => $response['nombre_web_user'],
    'apellidos_web_user' => $response['apellidos_web_user'],
    'user_mail' => $response['user_mail'],
    'profile_picture' => $response['profile_picture']
);

//Finally I create the session:
$this->session->set_userdata($newdata);

对于

   $id = $response['id_web_user'];
   $username = htmlspecialchars(sprintf('%s %s', $response['nombre_web_user'], $response['apellidos_web_user']));
   $newdata = array(
        'username'  => $username,
        'id_web_user' => $id,
        'logged_in' => TRUE
   );
   $this->session->set_userdata($newdata);      

请看一下,根据我的上一个代码,我只从 $response 数组中获取了三个值来构建我的自定义会话,它们是:

$response['id_web_user']
$response['nombre_web_user']
$response['apellidos_web_user']

所以,我只取了那个树值并将它们分别保存在各自的变量中,现在是:

$id = $response['id_web_user'];
$username = htmlspecialchars(sprintf('%s %s', $response['nombre_web_user'], $response['apellidos_web_user']));

请看看我在我的数组中添加了第三个值(作为 CodeIgniter 示例)'logged_in' => TRUE

这对我有用。

结论:我不得不说,在互联网上找到解决方案对我来说从来没有用过。我做的第一件事是在谷歌上搜索为什么调用通过 AJAX 创建会话的方法不起作用,我发现了两种可能性:

  1. 似乎自 2014 年以来 CodeIgniter 有一个错误,当时会话正在通过 AJAX 创建,并且为了可能的解决方案,您需要将 Session.php 文件替换到文件夹 system/Sessions.php 中。这个解决方案从来没有对我有用,因为该人在两个参考中建议的文件与我的 CodeIgniter 文件不匹配。

参考页面:

CodeignitEr Session not working with AJAX

https://forum.codeigniter.com/thread-68010.html

  1. 默认情况下,CodeIgniter 将会话数据存储在 cookie 中,大小上限为 2KB-4KB,具体取决于浏览器。如果您尝试在会话中存储超过 4KB 的数据,您将开始遇到问题。我想这可能正是我一直在做的事情,存储了大量 4KB 的数据。

参考页面:

codeIgniter : losing session data after login

我希望我的回答足以让我告诉你这是什么以及如何解决我的问题。如果此答案中缺少某些内容,请告诉我进行更新。谢谢。

【讨论】:

  • 您能详细说明这是如何解决您的问题的吗?您之前有 5 个数组元素,现在只有 3 个 - 这并没有太大的数据差异(实际上可以忽略不计)。 logged_in 并没有对 ci 做任何特别的事情。
  • 是的,没问题。为此,我可以编辑此答案还是创建一个新答案?
  • 只编辑这个。但是您要说的是,通过减小数组大小,您的会话现在可以工作了吗?这是非常奇怪的行为,因为您的数组一开始并没有那么大
  • 首先我想说你显然做了很多很棒的研究,我只是从故障排除的角度来看这个。 codeigniter 会话错误是 ci2 的一个问题,并且在会话库被完全重写后被消除。您提到的第二件事是大小 - 这很可能是因为我不知道您的数组值最初有多长。从调试的角度来看,我会 revert 到您的原始代码,而是使用基于 db 的会话。它只需要一个新的数据库表并更改配置中的变量。
  • 如果使用原始代码和数据库会话解决了您的问题,那么我们知道这是一个 cookie 大小问题,无需采取进一步措施。恢复到原始代码后,在更改为 db 会话之前,请检查此问题是否也存在于其他浏览器(如 firefox)中。否则,我认为这可能值得向 CI 开发人员报告。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2011-04-20
相关资源
最近更新 更多