问题描述
我目前正在学习PHP,并尝试创建一个类以每60秒重新生成一个session_id。我已经在Apache24,PHP 7.4环境中进行了设置。
刷新浏览器时,旧会话的所有数据都会丢失,条件(!isset($this->sessionStartTime))
为TRUE
if (!isset($this->sessionStartTime)) {
$this->sessionStartTime = time();
}
if ((time() - $this->sessionStartTime) > ($this->ttl)) {
$this->sessionStartTime = time();
return session_regenerate_id(true);
session_set_save_handler($this,true);
成功重新生成了会话,但是数据会话未得到安全保护,并且未调用函数write($session_id,$session_data)
。
(希望这不是所提任何其他问题的重复。在Stackoverflow和Google上进行了大量搜索,但没有找到解决我挑战的答案)
我的会话处理程序代码如下:
<?PHP
define('SESSION_SAVE_PATH',dirname(realpath(__FILE__)) . DIRECTORY_SEParaTOR . 'sessions');
class AppSessionHandler extends SessionHandler
{
private $sessionName = 'MYAPPSESS';
private $sessionMaxLifeTime = 0;
private $sessionSSL = False;
private $sessionHTTPOnly = True;
private $sessionPath = '/';
private $sessionDomain = '.test.at';
private $sessionSavePath = SESSION_SAVE_PATH;
private $sessionCipherAlgo = MCRYPT_BLOWFISH;
private $sessionCipherMode = MCRYPT_MODE_ECB;
private $sessionCipherKey = 'WYCRYPT0K3Y02016';
private $ttl = 60;
public function __construct()
{
ini_set('session.use_cookies',1);
ini_set('session.use_only_cookies',1);
ini_set('session.use_trans_sid',0);
ini_set('session.save_handler','files');
session_name($this->sessionName);
session_save_path($this->sessionSavePath);
session_set_cookie_params(
$this->sessionMaxLifeTime,$this->sessionPath,$this->sessionDomain,$this->sessionSSL,$this->sessionHTTPOnly
);
session_set_save_handler($this,true);
}
public function __get($key)
{
return false !== $_SESSION[$key] ? $_SESSION[$key] : false;
}
public function __set($key,$value)
{
$_SESSION[$key] = $value;
}
public function __isset($key){
return isset($_SESSION[$key]) ? true : false;
}
public function read($session_id)
{
return mcrypt_encrypt($this->sessionCipherAlgo,$this->sessionCipherKey,parent::read($session_id),$this->sessionCipherMode);
}
public function write($session_id,$session_data)
{
return parent::write($session_id,mcrypt_encrypt($this->sessionCipherAlgo,$session_data,$this->sessionCipherMode));
}
public function start()
{
if ('' === session_id()) {
if (session_start()) {
if (!isset($this->sessionStartTime)) {
$this->sessionStartTime = time();
}
if ((time() - $this->sessionStartTime) > ($this->ttl)) {
$this->sessionStartTime = time();
return session_regenerate_id(true);
}
}
}
}
}
$session = new AppSessionHandler();
$session->start();
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)