我面临着会话变量在操作重定向时重置的奇怪问题。
我正在使用Codeigniter并在登录后重定向到仪表板操作,在使用DB验证凭据后,我在登录操作中获取数据,但是当我使用redirect((重定向到仪表板时,会话变量消失了。
管理员.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 中尝试过这个,所有浏览器,但问题仍然保持不变,任何帮助将不胜感激。
您使用的是哪个版本的 CodeIgniter?您可以尝试以下步骤。
- 转到系统/库/会话/会话.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);
- 转到主索引.php,它是第一个索引.php与子目录"应用程序","系统","user_guide"等位于同一目录中。
- 把
session_start()
放在< ?php
之后
希望这能帮助你。
您必须使用this->session->set_userdata()
来设置会话。this->session-> set_ flashdata()
用于设置在下一步操作后删除的闪存消息。
由于新的 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 设置为"严格"或"宽松"(Lax 现在将成为默认值(,则不会。
溶液:
cookie属性SameSite可以设置为"无",并将"安全"属性指定为"true"。将"安全"属性设置为"true"将要求您的网站在 https 上运行。使用 http://协议运行的网站将无法设置"安全"cookie。 请将"HttpOnly"属性设置为"true",以便仅对服务器的http请求可访问。
在 PHP 中,可以实现如下
session_set_cookie_params(0, '/PATH/;SameSite=None',