我使用自定义会话处理程序来保存和读取数据库中的会话数据:
class c_session implements SessionHandlerInterface {
private $db; // Database
// Constructor
public function __construct($database){
$this->db = $database;
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
register_shutdown_function('session_write_close');
}
// Custom made session start
public function start_session() {
global $globals; // Included in config.php
// Make sure the session cookie is not accessible via javascript.
$httponly = true;
// Force the session to only use cookies, not URL variables.
ini_set('session.use_only_cookies', 1);
// Get session cookie parameters and set the parameters
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $globals['https'], $httponly);
// Change the session name
session_name($globals['session_name']);
// Now we can start the session
session_start();
}
...
在每个网页中,我都会阅读会话以检查用户是否已登录:
function signin_check($db, $session) {
global $globals; // Included in config.php
$session->start_session();
try {
// Check if all session variables are set
if(isset($_SESSION['A'], $_SESSION['B'])) {
...
如果她没有,她就会退出。
变量 $_SESSION['A']
和 $_SESSION['B']
在登录页面中设置。
系统在99%的时间内完美运行,但有时,在更改网页时,它会随机记录您。发生这种情况是因为 $_SESSION['A']
和 $_SESSION['B']
在没有(已知)原因的情况下都未设置。
为什么以及如何防止这些注销?
答案 0 :(得分:0)
会话超时,正如@Rat在他/她的评论中指出的那样,或者有一个代码块由于某种原因而取消设置$_SESSION["A"]
或$_SESSION["b"]
。检查发生这种情况的页面。如果您可以在不注销的情况下访问这些页面,但有时会"您已注销,然后您的设置出现问题。否则你应该查看页面的代码,看看他们在哪里注销你。