如何获取cookie的过期时间

74

当我创建一个cookie时,如何获取cookie的过期时间?


2
http://bytes.com/topic/php/answers/486298-get-cookie-expiry-time - Haim Evgi
1
获取Cookie的过期时间是什么意思?您想知道如何计算它吗?还是想从已设置的Cookie中检索它? - Gumbo
1
如果您不知道如何获取cookie头,则可以使用https://github.com/delight-im/PHP-Cookie中的`Cookie :: parse($ cookieHeader)ResponseHeader :: get('Set-Cookie')`。 - caw
6个回答

113

在cookie中放置一个编码后的json是我最喜欢的方法,以便从cookie中获得格式良好的数据。 尝试这样做:

$expiry = time() + 12345;
$data = (object) array( "value1" => "just for fun", "value2" => "i'll save whatever I want here" );
$cookieData = (object) array( "data" => $data, "expiry" => $expiry );
setcookie( "cookiename", json_encode( $cookieData ), $expiry );

那么下次当你获取你的cookie时:

$cookie = json_decode( $_COOKIE[ "cookiename" ] );

你可以简单地提取过期时间,这个时间是插入到cookie本身的数据中的。

$expiry = $cookie->expiry;

此外,输出的数据将以可用对象形式呈现 :)

$data = $cookie->data;
$value1 = $cookie->data->value1;

等等,我发现这是使用 cookie 的更整洁的方式,因为您可以嵌套许多小对象于其他对象中,而不受限制!


5
这是获胜的答案。谢谢。 - Rápli András
我也认为这是更好的答案(或策略)。为什么要创建另一个 cookie,当你可以使用同一个 cookie 来存储到期数据呢? - Andrew
真是太聪明了...我希望我能授予比允许的更多的声望。1+! - Super Cat
你可以通过添加某种签名来防止用户更改到期日期。 - My1
1
当我给出那个答案的时候,它是有用的,因为json编码/解码很容易被php或javascript处理,所以如果你想从服务器或客户端读取它,它是一样的。而serialize需要在javascript中添加一个额外的函数...并且serialize占用更多的空间。无论如何,这是您的选择,解决方案只是将到期时间编码在cookie数据中,任何您想要的方式;) - Braikar

52

这很难实现,但可以在另一个Cookie中设置cookie到期日期。稍后可以读取此Cookie以获取到期日期。也许有更好的方法,但这是解决您问题的方法之一。


11
是的,这就是方法。这是微软说的:“浏览器负责管理 cookie,并且 cookie 的到期时间和日期有助于浏览器管理其 cookie 存储。因此,尽管可以读取 cookie 的名称和值,但无法读取 cookie 的到期日期和时间。当浏览器将 cookie 信息发送到服务器时,浏览器不包含到期信息。”http://msdn.microsoft.com/en-us/library/ms178194(v=vs.100).aspx - Ricardo stands with Ukraine

13

您可以设置包含到期时间的Cookie值,并从Cookie值中获取到期时间。

// set
$expiry = time()+3600;
setcookie("mycookie", "mycookievalue|$expiry", $expiry);

// get
if (isset($_COOKIE["mycookie"])) {
  list($value, $expiry) = explode("|", $_COOKIE["mycookie"]);
}

// 请记住,在这种情况下,一些双向加密会更安全。请参见:https://github.com/qeremy/Cryptee


6
当你通过PHP创建cookie时,默认值为0,参考手册:
如果设置为0或省略,则cookie将在会话结束时过期(即浏览器关闭时)。
否则,您可以将cookie的生存时间设置为第三个参数中的秒数。

http://www.php.net/manual/en/function.setcookie.php

但是,如果你想要获取已存在的cookie的剩余生命周期,恐怕这是不可能的(至少不能直接实现)。


3
似乎有一个由php的headers_list()返回的数组,其中包含发送给浏览器的所有cookie列表,其中"Set-Cookie"元素如下: Set-Cookie: cooke_name=cookie_value; expires=expiration_time; Max-Age=age; path=path; domain=domain 这样,您也可以获取已删除的cookie,因为它们的值为deletedSet-Cookie: cooke_name=deleted; expires=expiration_time; Max-Age=age; path=path; domain=domain 从那里开始,很容易检索特定cookie的过期时间或年龄。请记住,这个数组可能仅在实际调用setcookie()后才可用,因此对于已经完成工作的脚本有效。我没有以其他方式测试过这一点,因为这对我来说运行得非常好。
这是一个比较老的话题,我不确定是否适用于所有php版本,但我认为这可能会有所帮助。
更多信息请参见:

https://www.php.net/manual/en/function.headers-list.php
https://www.php.net/manual/en/function.headers-sent.php


1
要获取cookie的过期时间,请使用这个简单的方法。
<?php

//#############PART 1#############
//expiration time (a*b*c*d) <- change D corresponding to number of days for cookie expiration
$time = time()+(60*60*24*365);
$timeMemo = (string)$time;

//sets cookie with expiration time defined above
setcookie("testCookie", "" . $timeMemo . "", $time);

//#############PART 2#############
//this function will convert seconds to days.
function secToDays($sec){

    return ($sec / 60 / 60 / 24);

}
//checks if cookie is set and prints out expiration time in days
if(isset($_COOKIE['testCookie'])){

    echo "Cookie is set<br />";
    if(round(secToDays((intval($_COOKIE['testCookie']) - time())),1) < 1){
        echo "Cookie will expire today.";
    }else{
        echo "Cookie will expire in " . round(secToDays((intval($_COOKIE['testCookie']) - time())),1) . " day(s)";
    }

}else{
    echo "not set...";
}

你需要将第一部分和第二部分放在不同的文件中,否则每次都会得到相同的到期日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接