我正在使用CGI.pm来写出cookie。现在,在用户使用我的网站的过程中,其他cookie被添加到“test.com”cookie集中(如broswer历史中所示)
但现在我想将用户注销,并“清理”PC。由于我不知道用户使用了哪些脚本,我无法预见PC上会有哪些cookie。
简而言之,有一种方法可以将“test.com”的所有cookie读回脚本中,然后我可以用1s的持续时间再打印出来(有效地“删除”它们)**我知道你可以用$ xyz = cookie('$ name')读取cookie ...但是如何创建包含$ name变量的数组,以便我可以循环它?该脚本也将在“test.com”上运行,因此跨站点策略不是问题
+++++ brian d foy在下面添加了部分答案。所以我设想的代码可能会串在一起。
use CGI::Cookie;
%cookies = CGI::Cookie->fetch;
for (keys %cookies) {
$del_cookie.="cookie(-NAME=>'$cookies[$_]',-PATH=>'/',-EXPIRES=>'+1s');";
}
print header(-cookie=>[$del_cookie]);
我想知道脚本如何识别域名。出现脚本足够智能,只加载正在执行脚本的域的cookie。 (现在我只是要找出为什么Firefox不删除过期的cookie !!刚刚发现一些在我的测试域中已经过期的那些已经过期的1月29日 - 31日,并且首先想知道他们为什么没有出现在我的cookie列表中! )
答案 0 :(得分:0)
如果您尝试从CGI脚本执行此操作,则只能访问该域的Cookie。您可以通过给他们过去的时间来获取该列表并重置它们。
听起来你根本不问一个cookie问题。你问的是如何制作一个数组。 CGI::Cookies(随CGI.pm提供)有一个示例来处理您在该域下有权访问的所有Cookie:
%cookies = CGI::Cookie->fetch;
for (keys %cookies) {
do_something($cookies{$_});
}
答案 1 :(得分:0)
这就是我最终的结果:
use CGI::Cookies;
%cookies = CGI::Cookie->fetch;
@cookie = keys %cookies;
for($x=0; $x<@cookie; $x++){
my $c = CGI::Cookie->new(-name => $cookie[$x],-value => '-',-expires => '+1s');
print "Set-Cookie: $c\n";
}
print "content-type: text/html\n\n";
Firefox仍然保留了完整的cookie,(显然这是一个“设计问题”而不是错误!!)但它们被重置为空值,并在1秒内设置为过期/变为冗余。另外,为什么在“内容类型”标题之前发送的“print”语句不会导致服务器错误,我不知道。好的,所以纯粹主义者可能会找到一个更简单的系统,并使用“foreach”而不是/ next循环......但我理解后者是如何工作的!