【问题标题】:How to get cookie's expire time如何获取cookie过期时间
【发布时间】:2011-05-11 08:00:55
【问题描述】:

创建cookie时,如何获取cookie的过期时间?

【问题讨论】:

标签: php cookies


【解决方案1】:

似乎有一个发送到浏览器的所有cookie的列表,由php的headers_list()返回,其中包括返回“Set-Cookie”元素,如下所示:

Set-Cookie: <strong>cooke_name</strong>=<strong>cookie_value</strong>; expires=<strong>expiration_time</strong>; Max-Age=<strong>age</strong>; path=<strong>path</strong>; domain=<strong>domain</strong>

这样你也可以得到删除的,因为它们的值是deleted

Set-Cookie: <strong>cooke_name</strong>=<strong>deleted</strong>; expires=<strong>expiration_time</strong>; Max-Age=<strong>age</strong>; path=<strong>path</strong>; domain=<strong>domain</strong>

从那里可以很容易地检索特定 cookie 的过期时间或期限。请记住,尽管此数组可能仅在 AFTER 实际调用setcookie() 后才可用,因此它对已经完成其工作的脚本有效。我没有以其他方式对此进行测试,因为这对我来说效果很好。

这是一个相当老的话题,我不确定这是否适用于所有 php 构建,但我认为它可能会有所帮助。

更多信息见:

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

【讨论】:

    【解决方案2】:

    要获取 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...";
    }
    

    ?>

    您需要将第 1 部分和第 2 部分保存在不同的文件中,否则您每次都会得到相同的过期日期。

    【讨论】:

      【解决方案3】:

      您可以设置包含过期时间的 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

      【讨论】:

        【解决方案4】:

        当你通过 PHP 创建 cookie 时,默认值为 0,来自手册:

        如果设置为 0 或省略,则 cookie 将在会话结束时过期 (当浏览器关闭时)

        否则你可以将cookies的生命周期设置为秒作为第三个参数:

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

        但如果你的意思是获得一个已经存在的 cookie 的剩余生命周期,我担心这是不可能的(至少不是直接的方式)。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 是的,就是这样。这就是微软所说的:“浏览器负责管理 cookie,cookie 的过期时间和日期帮助浏览器管理其存储的 cookie。因此,虽然您可以读取 cookie 的名称和值,但您无法读取 cookie 的过期日期和时间。当浏览器向服务器发送cookie信息时,浏览器不包含过期信息。 msdn.microsoft.com/en-us/library/ms178194(v=vs.100).aspx
          【解决方案6】:

          将编码的 json 放入 cookie 是我最喜欢的方法,它可以从 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 使用方式,因为您可以在其他对象中嵌套任意数量的小对象!

          【讨论】:

          • 这是成功的答案。谢谢。
          • 我也认为这是更好的答案(或策略)。既然可以使用同一个 cookie 来存储过期数据,为什么还要创建另一个 cookie?
          • 绝对聪明...我希望我能奖励比允许的更多的代表。 1+!
          • 并且通过添加某种签名,您甚至可以防止用户更改到期日期
          • 在我给出那个答案的时候,它很有用,因为 json 编码/解码很容易被 php 或 javascript 处理,所以如果你想从服务器或客户端读取它是一样的。而序列化需要在 javascript 中添加一个函数。而且序列化会占用更多空间。无论如何,这是您希望的选择,解决方案只是在 cookie 数据中对到期时间进行编码,无论您想要它;)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-04
          • 1970-01-01
          • 2011-09-20
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          • 2014-04-29
          相关资源
          最近更新 更多