Codeigniter发布请求创建多个会话

时间:2018-02-28 16:16:49

标签: php codeigniter session

我有一个codeigniter应用程序。我的目标是验证用户,并将其名称保存到会话var。

我使用fetch:

从页面发出帖子请求
await fetch('/api/auth/', {
  method: 'POST',
   headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    Username: args['userName'],
    Password: args['password'] 
  })
})

它转到我的api并最终进入模型,在模型中进行身份验证并保存到会话中:

$this->load->library('session');
$_SESSION['userdata'] = array(
    'username' => $user,
    'testme' => 'test'
);

然后在我的页面控制器中,我尝试检索数据并查看它们是否已经过验证:

defined('BASEPATH') OR exit('No direct script access allowed');

class TimeClock extends CI_Controller {

public function index()
{   

    $this->load->library('session');
    //$userdata = $this->session->set_userdata(array('test' => 'success'));
    $userdata = $_SESSION;

    var_dump($userdata);
...

下面是一些相关的配置文件:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'timeclock_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] =APPPATH . '/timeclock_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

我在使用php 7.0和codeigniter 3.1.7

我遇到的问题是我加载页面时模型中的会话数据集不存在。但是,如果我在控制器中设置会话数据,只是一些虚拟数据,即使在页面刷新之后它也会存在。

查看实际的会话文件,我可以看到两个已创建,让我们说会话A和B.

会话A为空(除了CI创建的_ci_last_regenerate属性),会话B具有我的数据(用户名和testme属性)。查看我的浏览器应用程序/ cookie数据,我可以看到会话A正在加载

所以不知何故,post请求被计为一个完全不同的会话,然后是我的页面加载使用的会话。

我使用了codeigniters会话库来设置会话而不是$ _SESSION全局,它提供与上面完全相同的结果,我切换到使用$ _SESSION,因为我读了$ this-> session - > set_userdata()已被删除。

修改

我认为id需要额外的努力并用一些图片说明真正的问题:

加载页面(我检查会话数据)会创建一个会话,并使发布请求成为第二个会话,这里是会话:

enter image description here

第一个内容:

__ ci_last_regenerate | I:1519850738;

第二个内容:

__ ci_last_regenerate | I:1519850762;测试| S:7: “成功”;

Theres the data,in the second one。

enter image description here

而且浏览器正在加载什么。空的。这种情况一直发生,如果我编辑该值以匹配其他会话,那么它会加载我的数据。 因此,更多的是分配会话ID然后实际保存会话的问题。

1 个答案:

答案 0 :(得分:1)

因此,经过几个小时的问题我找到了解决方案。

首先,我尝试将auth请求作为get请求而不是帖子。起初,这似乎给出了相同的结果,但后来我在测试时注意到,如果我使用我的浏览器发出请求(只是将网址放入地址栏),它就会工作。所以我认为问题在于我是如何提出要求的。

所以我切换到Axios而不是使用fetch(),现在一切正常。不知道为什么获取dosnt工作,也许我需要某种头或类似的东西。让我知道是否有人可以对此有所了解。

修改

我已经弄清楚为什么在一个月之后在MDN文档中读取此行以获取fetch()

  

默认情况下,fetch不会从服务器发送或接收任何cookie,   如果站点依赖,则会导致未经身份验证的请求   维护用户会话(发送cookie,凭证init   必须设置选项)。