如果-expires设置为-1,CGI :: Cookie会存在多长时间?

时间:2014-03-03 14:20:02

标签: perl cookies cgi

如果CGI:Cookie设置为-1那么它表示什么?

 -expires =>  '-1'

Cookie会活多久?

3 个答案:

答案 0 :(得分:4)

Perl将-1未终止到浏览器,并且它们应立即使cookie过期。

至少它是RFC2616

答案 1 :(得分:1)

在CGI的源代码中查看,过期的部分似乎在CGI::Util中得到验证。以下是执行契约的代码:

sub expire_calc {
    my($time) = @_;
    my(%mult) = ('s'=>1,
                 'm'=>60,
                 'h'=>60*60,
                 'd'=>60*60*24,
                 'M'=>60*60*24*30,
                 'y'=>60*60*24*365);
    # format for time can be in any of the forms...
    # "now" -- expire immediately
    # "+180s" -- in 180 seconds
    # "+2m" -- in 2 minutes
    # "+12h" -- in 12 hours
    # "+1d"  -- in 1 day
    # "+3M"  -- in 3 months
    # "+2y"  -- in 2 years
    # "-3m"  -- 3 minutes ago(!)
    # If you don't supply one of these forms, we assume you are
    # specifying the date yourself
    my($offset);
    if (!$time || (lc($time) eq 'now')) {
      $offset = 0;
    } elsif ($time=~/^\d+/) {
      return $time;
    } elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([smhdMy])/) {
      $offset = ($mult{$2} || 1)*$1;
    } else {
      return $time;
    }
    my $cur_time = time; 
    return ($cur_time+$offset);
}

似乎只有else块会捕获-1,因为它后面没有一个指定的修饰符。

然后将从此函数返回

-1。由于这不是一个有效的时间,我想这个cookie会立即过期,但我不确定那一点。它也可能导致您的请求出错(此时也不确定)。

答案 2 :(得分:1)

如果你运行它,你会发现它将传递文字-1而不是替换时间戳值。

use feature 'say';
use CGI::Cookie;
say CGI::Cookie->new(-name=>'foo', -value => 'bar', expires => '-1')->as_string;
say CGI::Cookie->new(-name=>'foo', -value => 'bar', expires => '-1M')->as_string;

__END__
foo=bar; path=/; expires=-1
foo=bar; path=/; expires=Sat, 01-Feb-2014 14:43:03 GMT

阅读Wikipedia article表明格式始终是此时间戳。人们可以深入挖掘并查看定义行为的RFC。