我有一个基本的登录系统。基本的登录/注销功能如下:
function login() {
global $page;
if ($_COOKIE['adminUser'] == adminUser && $_COOKIE['adminPass'] == adminPass):
$_SESSION['adminLogin'] = true;
redirect($_SERVER['REQUEST_URI']);
elseif ($_POST['adminUser'] == adminUser && $_POST['adminPass'] == adminPass):
setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7);
setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7);
$_SESSION['adminLogin'] = true;
redirect($_SERVER['REQUEST_URI']);
else:
$page->content->table = new template('admin/login.tpl');
// it shows the login form
endif;
}
function logout() {
$_SESSION['adminLogin'] = false;
setcookie('adminUser', false, time() - 60*100000);
setcookie('adminPass', false, time() - 60*100000);
redirect(pathApp);
}
redirect($x)
是header("Location: $x"); die;
。
整个剧本中的任何地方都没有设置其他COOKIES。
问题是注销功能无法正常工作。我尝试通过Firebug进行调试,看看正在发送什么标题,所有对我来说都没问题。这是Firebug的注销日志:
Response Headers
HTTP/1.1 200 OK
Date: Fri, 15 Apr 2011 18:48:57 GMT
Server: Apache
X-Powered-By: PHP/5.2.13
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: adminUser=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT
adminPass=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT
Content-Length: 1041
Connection: close
Content-Type: text/html
Request Headers
GET /freeads/admin/logout HTTP/1.1
Host: clienti.bsorin.ro
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://clienti.bsorin.ro/freeads/admin
Cookie: adminUser=q; adminPass=q; PHPSESSID=22faf6e20467b88d97dc7838572cbd47
该脚本在http://clienti.bsorin.ro/freeads/admin生效。用户名和密码均设置为“q”。
谢谢!
答案 0 :(得分:16)
系统似乎有缺陷,因为我没有正确设置cookie。我没有使用path
参数。 Cookie已设置为/path/login
,并且已在path/logout
删除。
正确的方法是将setcookie()
命令对(登录和退出)更改为:
setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7, '/');
setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7, '/');
setcookie('adminUser', false, time() - 60*100000, '/');
setcookie('adminPass', false, time() - 60*100000, '/');
注意第四个参数path
被设置为/
。我花了一段时间,但我发现了:)。
答案 1 :(得分:3)
我注意到您使用的是子域名。 setCookie有第五个参数,用于指定域。使用子域删除cookie非常棘手。这对我有用
setCookie("clockInTime", $param, date('U')+86502,'/', '.mywebsite.com')
最后一个参数将使用'。'来获取mywebsite的任何和所有子域。在域名之前。
答案 2 :(得分:0)
setcookie($name, $val, $time, '/');
调用注销时我可以看到以下错误。
调试: [class_dispatcher.php:26] [标量 [integer / float / string / boolean]] page->内容不属于类 '模板'
这很可能是原因 - 因为它是在调用setcookie之前输出的。
答案 3 :(得分:0)
您可以使用setcookie()更改Cookie的到期时间。
重要提示:在将任何数据发送到浏览器之前,必须更新cookie的到期时间,因为浏览器会识别cookie并根据从服务器发送到浏览器的标头来存储它,因此您必须先使用setcookie()用于更新Cookie到期时间的标题