【发布时间】: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 调用不会完成:
事实上,无效的 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