我有一个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需要额外的努力并用一些图片说明真正的问题:
加载页面(我检查会话数据)会创建一个会话,并使发布请求成为第二个会话,这里是会话:
第一个内容:
__ ci_last_regenerate | I:1519850738;
第二个内容:
__ ci_last_regenerate | I:1519850762;测试| S:7: “成功”;
Theres the data,in the second one。
而且浏览器正在加载什么。空的。这种情况一直发生,如果我编辑该值以匹配其他会话,那么它会加载我的数据。 因此,更多的是分配会话ID然后实际保存会话的问题。
答案 0 :(得分:1)
因此,经过几个小时的问题我找到了解决方案。
首先,我尝试将auth请求作为get请求而不是帖子。起初,这似乎给出了相同的结果,但后来我在测试时注意到,如果我使用我的浏览器发出请求(只是将网址放入地址栏),它就会工作。所以我认为问题在于我是如何提出要求的。
所以我切换到Axios而不是使用fetch(),现在一切正常。不知道为什么获取dosnt工作,也许我需要某种头或类似的东西。让我知道是否有人可以对此有所了解。
修改强>
我已经弄清楚为什么在一个月之后在MDN文档中读取此行以获取fetch()
默认情况下,fetch不会从服务器发送或接收任何cookie, 如果站点依赖,则会导致未经身份验证的请求 维护用户会话(发送cookie,凭证init 必须设置选项)。