太多的重定向- cookie JS + php实现



我有一个简单的网站,你只需要一个密码来访问内容。然后有3个字段,用户在其中输入数据,然后存储在cookie中。最后-有一个注销脚本,重置会话和取消设置cookie。

请查看下面的相关代码:

登录页面(索引)

<?php
session_start();
$password = '';
$wrongPassword = '';
if (isset($_POST['sub'])) {
$password = $_POST['login_passcode'];
if ($password === 'PASSCODE') {
    $_SESSION['login'] = true;
    header('LOCATION:/personal.php');
    die();
} else {
    $wrongPassword = true;
}
}
if (isset($_COOKIE['m_username'])) {
header('LOCATION:/personal.php');
die();
}
?>

包含内容的页面,其中用户输入姓名、部门和开始日期

<?PHP
session_start();
if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header("Location:/index.php");
die();
}
?>

和注销脚本:

<?PHP
session_start();
if (isset($_COOKIE[session_name()])):
    setcookie(session_name(), '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_username'])):
    setcookie('marriott_username', '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_startdate'])):
    setcookie('marriott_startdate', '', time() - 7000000,'/');
endif;
if (isset($_COOKIE['m_department'])):
    setcookie('m_department', '', time() - 7000000,'/');
endif;
$_SESSION = array();
session_destroy();
header ("Location:/index.php");
die();
?>

jQuery创建cookie

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
    var expires = "expires=" + d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}

cookie确实过期(至少在chrome上),但是在尝试访问网站几个小时或几天后,我得到了关于太多重定向的错误。我相信这可能是由于会话过期时间和cookie过期时间(cookie为5天)之间的一些差异,但我真的不知道从哪里开始修复这些…

另外,在Internet Explorer (IE8)上,即使我直接注销,也会出现重定向问题。

将感激任何帮助,e .

您认为不同的cookie过期是太多重定向问题的背后是正确的。

如果索引页中的isset($_COOKIE['m_username'])为真,则您将被重定向到个人页面,如果if (!(isset($_SESSION['login']) && $_SESSION['login'] != ''))也为真,则将您送回索引,从而创建一个循环。这可能是由于会话cookie在您设置的cookie之前过期。

$_COOKIE$_SESSION超全局指的是两组不同的cookie。一种解决方案是只使用PHP会话并将所有会话数据存储在$_SESSION超全局变量中。

例如:

$_SESSION['m_username'] = 'whatever_value';
然而,这将产生额外的内存使用开销。如果您仍然希望使用自己的cookie,那么只需确保确定重定向的任何逻辑都是基于会话,而不是基于您设置的cookie的存在。例如:

// When logging in
$_SESSION['logged_in'] = true;
// On every page that requires login
if(!$_SESSION['logged_in']) // Redirect

最新更新