php 未删除cookie

6qfn3psc  于 2022-12-02  发布在  PHP
关注(0)|答案(5)|浏览(195)

我有一个基本的登录系统。基本的登录/注销功能如下:

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);
    }

是的。
在整个脚本中的任何地方都没有设置其他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”。
谢谢你!

wa7juj8i

wa7juj8i1#

看起来系统一开始就有缺陷,因为我没有正确设置cookie。我没有使用path参数。cookie在/path/login被设置,在path/logout被删除。
正确的方法是将两个setcookie()命令对(login & logout)更改为:

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被设置为/。我花了一段时间,但我想通了:)。

7fhtutme

7fhtutme2#

我注意到你使用的是一个子域。setCookie有第五个参数,它将指定域。删除子域的cookie是一个棘手的问题。这对我来说是有效的

setCookie("clockInTime", $param, date('U')+86502,'/', '.mywebsite.com')

最后一个参数将选取mywebsite的任何和所有子域,在域之前使用'.'。

rta7y2nd

rta7y2nd3#

1.在使用setcookie之前检查您没有发送任何头。
1.把你的条件句改成花括号(我求你了)
1.确保您在同一个域(和路径)上设置/删除cookie尝试使用setcookie($name, $val, $time, '/');
当调用注销时,我可以看到以下错误。
正在调试:[class_dispatcher. php:26] [标量[整数/浮点数/字符串/布尔值]]页面-〉内容不属于类'template'
这很可能是原因-因为它在调用setcookie之前输出。

lnlaulya

lnlaulya4#

您可以使用setcookie()更改cookie的过期时间。

重要提示:cookie的过期时间必须在任何数据发送到浏览器之前更新,因为浏览器根据从服务器发送到浏览器的头来识别cookie并存储它,所以您必须在头之前使用setcookie()来更新cookie的过期时间

watbbzwu

watbbzwu5#

在我的例子中,问题是当我使用fetch api向后端发出请求时,我忘记将credentials参数设置为'include'.{credentials:'包含'}

相关问题