SESSION 变量在 Codeigniter php 中的 redirect() 上被重置
Posted
技术标签:
【中文标题】SESSION 变量在 Codeigniter php 中的 redirect() 上被重置【英文标题】:SESSION variable is reset on redirect() in Codeigniter php 【发布时间】:2020-02-08 07:11:23 【问题描述】:我遇到了一些奇怪的问题,即会话变量在操作重定向时被重置。
我正在使用 Codeigniter 并在登录后重定向到仪表板操作,在使用 DB 验证凭据后,我在登录操作中获取数据,但是当我使用 redirect() 重定向到仪表板时,会话变量消失了。
Admin.php
<?php class admin extends CI_Controller
function login()
$login = $this->Admin_model->login($this->input->post()); // <-- verify data and set to session
if($login)
$this->session->set_flashdata("success","Logged in Successfully");
var_dump($_SESSION); // <-- able to fetch data from session
// exit();
redirect("admin/dashboard");
else
$this->session->set_flashdata("error","Invalid Credentials!! Please Try Again!!");
redirect("admin");
function dashboard()
var_dump($_SESSION); // <-- session data is vanished and not able to get userdata('id')
exit();
if($this->session->userdata('id') != '')
$data['active_tab'] = "dashboard";
else
redirect("admin");
?>
Admin_model.php
<?php Class Admin_Model extends CI_Model
function login($data)
$user = $this->db->get_where("users",array("username" => $data['username'],
"password" => md5($data['password']),
"is_active" => "1")
)->row_array();
if(!empty($user))
$this->set_user_session($user);
return true;
else
return false;
function set_user_session($login)
$arr = array();
$arr["id"] = $login["id"];
$arr["username"] = $login["username"];
$this->session->set_userdata($arr);
?>
在 xampp 和 wamp 中尝试过,所有浏览器,但问题仍然存在,任何帮助将不胜感激。
【问题讨论】:
您使用的是什么 CI 版本和什么 PHP 版本?如果将值分配给 $_SESSION 数组,它会起作用吗? 我的 CI 版本是 3.1.0 和 php 7.2.18 早期的3.1.x版本出现问题,尝试升级到最新的3.1.11,看我的回答:***.com/a/46876622/2275490 @Vickel 有正确的答案。您需要升级您的 CI 版本。 我的相同代码正在运行,但它突然停止运行,仍然需要更新 CI? 【参考方案1】:您使用的是哪个版本的 CodeIgniter?您可以尝试以下步骤。
-
转到 system/libraries/Session/Session.php
通过添加
//
评论session_start()
。我们想重新定位 sessionn_start()。
查找 (using ctrl + f
) 一条写有 Security is king
的评论。注释掉该注释下的所有行,直到函数结束。在我的例子中,我注释掉了第 315 - 320 行。
在第 282 行将这行 ini_set('session.name', $params['cookie_name']);
更改为 ini_set('session.id', $params['cookie_name']);
注释掉下面几行
line 108 //session_set_save_handler($class, TRUE);
line 290-296
// session_set_cookie_params(
// $params['cookie_lifetime'],
// $params['cookie_path'],
// $params['cookie_domain'],
// $params['cookie_secure'],
// TRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons
// );
line 305 //ini_set('session.gc_maxlifetime', $expiration);
session_start()
放在< ?php
之后
希望对你有帮助....
【讨论】:
这给出了错误A PHP Error was encountered Severity: Warning Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time Filename: Session/Session.php Line Number: 305
它工作了......!!!!我们需要注释掉更多的行,但你能解释一下我们禁用的所有东西吗?
PHP 7 升级 - * 已知会话/COOKIE 错误 - 将 php 5 升级到 php 7 将解决已知的会话/cookie 错误。 $this->session->set_userdata(); 似乎有问题并且每次重定向时,cookie 值都会被覆盖。
@NitishLad 你还评论了什么,能告诉我吗?【参考方案2】:
您必须使用this->session->set_userdata()
来设置会话。 this->session-> set_ flashdata()
用于设置在下次操作后删除的闪烁消息。
【讨论】:
我正在使用相同的即 $this->session->set_userdata($arr); 设置会话变量,它也设置,但在签入后消失仪表板操作。【参考方案3】:新版本的浏览器可能会因为新的 cookie 政策而破坏会话。
参考资料 https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
每当需要将 cookie 发送到服务器时,浏览器都会看到 SameSite 属性来决定 cookie 是发送到服务器还是被阻止。对于用户操作,它会发送到服务器,但对于自动重定向,如果 SameSite 设置为“Strict”或“Lax”(Lax 现在将成为默认值),则不会。
解决方案:
可以将 cookie 属性 SameSite 设置为“无”,同时将“安全”属性指定为“真”。将“安全”属性设置为“真”将要求您的网站在 https 上运行。使用 http:// 协议运行的站点将无法设置“安全”cookie。 请将 'HttpOnly' 属性设置为 'true' 以使其仅对服务器的 http 请求可访问。
在PHP中可以如下实现
session_set_cookie_params(0, '/PATH/; SameSite=None',
【讨论】:
以上是关于SESSION 变量在 Codeigniter php 中的 redirect() 上被重置的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 codeigniter 会话 userdata 变量的值?