我在这里陷入了令人沮丧的困境。我有一个使用单例对象的身份验证系统(从头开始构建)。
单例对象基本上管理会话的安全性,并具有防止会话劫持和其他恶意活动的功能。
这些功能取决于会员数据。
现在的问题是,每次用户刷新或移动到新页面时,PHP似乎都会丢弃这些单例对象。
以下是会话类的原型:
class session extends login{
public $sessionid;
private $fingerprint;
public static $temp=0;
public static $s_instance = NULL;
public static function s_getinstance(){
if (!isset(session::$s_instance) || !isset(session::$sessionid)) {
$c = __CLASS__;
if(isset(session::$s_instance)) {
session::$s_instance = 0;
}
session::$s_instance = new $c;
self::regenerate_id_name();
self::$temp +=1;
}
return session::$s_instance;
}
}
最后一个函数检查数据成员($ s_insntance),如果它是NULL,它会创建一个对象并将其抛回,同时管理与创建新会话相关的活动。
如果数据成员不为null,则返回现有对象。
或者在理论上,这就是应该做的事情。但是,每次访问新页面并调用s_getinstance函数时,它都会尝试根据某种原因创建一个全新的对象,旧数据将丢失。请帮帮我。
答案 0 :(得分:6)
我们在此处未看到的是,您将会话对象的内容保存到$_SESSION
中。如果不这样做,它就无法在页面加载中持续存在。
您需要一种方法将会话实例保存到PHP $_SESSION
中,然后您的s_getinstance()
需要检查$_SESSION
中是否已存在并从那里检索它,或从中检索它内存,或者如果它在任何地方都不存在,则从头开始创建。
Start reading here...(有关PHP会话处理的文档)
// assuming you've already called session_start()...
public function storeinstance()
{
$_SESSION['session'] = self::s_getinstance();
}
public static function s_getinstance(){
if (!isset(session::$s_instance) || !isset(session::$sessionid)) {
$c = __CLASS__;
// Check if it's already sitting in $_SESSION
// Load it from $_SESSION if it's there, and then unset the $_SESSION var
if (!isset(session::$s_instance) && isset($_SESSION['session'])) {
session::$s_instance = $_SESSION['session'];
unset($_SESSION['session']);
}
else if(isset(session::$s_instance)) {
session::$s_instance = 0;
}
session::$s_instance = new $c;
self::regenerate_id_name();
self::$temp +=1;
}
return session::$s_instance;
}