php 删除cookie方法详解
我们先来看下相关cookie的机制。
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )
要删除cookie需要确保它的失效期是在过去,才能触发浏览器的删除机制。
下面的例子说明了如何删除刚才设置的cookie:
<?php
//将过期时间设为一小时前
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);
?>
删除一个cookie的方法就是把这个cookie的有效期设置为当前时间以前,这也是几乎所有php程序员都会这么做。
后来一个初接触php的朋友告诉我,他在程序中本想把一个cookie的值设置为空,结果导致这个cookie直接被删除。我当时的第一反应是不相信,于是测试
了一下:
setcookie("testcookie", '');
print_r($_COOKIE);
结果果然是整个$_COOKIE数组都是空的,而非仅仅$_COOKIE['testcookie']为空。于是用winsock抓包,观察返回的http头,发现http头竟然是“Set-Cookie: testcookie=deleted; expires=Mon, 18-Jun-2007 02:42:33 GMT”,这说明“setcookie("testcookie", '');”的的确确是将testcookie这个cookie直接删除,而关于这种情况在php手册中完全没有说明。
最后阅读php源码,终于发现真相(这就是开源的好处了,有什么不清楚的内幕,直接查源码)。
以下代码可以在php5.20的linux源码包中ext/standard/head.c第99行附近找到:
if (value && value_len == 0) {
/*
* MSIE doesn't delete a cookie when you set it to a null value
* so in order to force cookies to be deleted, even on MSIE, we
* pick an expiry date 1 year and 1 second in the past
*/
time_t t = time(NULL) - 31536001;
dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, t, 0 TSRMLS_CC);
sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);
efree(dt);
} else {
sprintf(cookie, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
if (expires > 0) {
strcat(cookie, "; expires=");
dt = php_format_date("D, d-M-Y H:i:s T", sizeof("D, d-M-Y H:i:s T")-1, expires, 0 TSRMLS_CC);
strcat(cookie, dt);
efree(dt);
}
}
源码中清清楚楚的显示“if (value && value_len == 0)”,当“value_len”为0时,“sprintf(cookie, "Set-Cookie: %s=deleted; expires=%s", name, dt);”会发送删除cookie的http头给浏览器。
最后我们可以得出结论:在php中使用“setcookie($cookiename, '');”或者“setcookie($cookiename, NULL);”都会删除cookie,当然这些手册中并没有。
是不是很简单呢,有时候我们还是非常有必要好好读读php源码的。
php 删除cookie方法详解相关推荐
- python清空集合_python集合删除多种方法详解
这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...
- 删除oracle数据库的三种方法,oracle数据库的删除方法详解
oracle数据库的删除方法详解 1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@local ...
- python list遍历删除,对python list 遍历删除的正确方法详解
在遍历list的时候,删除符合条件的数据,可是总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num ...
- php httponly_PHP设置Cookie的HTTPONLY属性方法详解
下面小编就为大家带来一篇PHP设置Cookie的HTTPONLY属性方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 httponly是微软对cookie做的扩展,这 ...
- php的cookie教程,PHP4之COOKIE支持详解
PHP4之COOKIE支持详解 发布时间:2016-06-17 来源: 点击: 次 PHP4之COOKIE支持详解 建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的信息,在PHP中提供了两 ...
- cookie 操作详解 (asp.net javascript)
(1)ASP.NET cookie 操作详解|cookie 写入.读取.修改.删除2008年10月18日 //写入 protected void Button2_Click(objec ...
- Cookie用法详解
cookie简介 1. 定义 cookie是由服务器发送给客户端(浏览器)的小量信息. 2. 作用 cookie是键值对形式存储的少量信息,那它有什么作用呢? 我们知道,平时上网时都是使用无状态的HT ...
- Spring JdbcTemplate方法详解
2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...
- mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解
前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...
最新文章
- ICCV2019论文点评:3D Object Detect疏密度点云三维目标检测
- strace命令学习
- Mother's Day
- 使用拦截器和redis+token实现防重复提交完整代码
- MSSQL日期格式转换函数(使用CONVERT)
- 互联网企业架构初期选择--初期技术选型
- 极力推荐收藏的几个高清免费图片素材网站
- 7段数码管驱动电路设计
- 10只狗怎么来判断1000瓶药水中哪个有毒
- ICE java实现helloworld
- hankerrank 刷题二( Python 基础)
- QoS服务质量二令牌桶算法及QoS业务分类
- 推荐5款热门脑图软件!
- 同轴电缆阻抗总结(电阻、阻抗、特性阻抗)
- Python写游戏,我上我也行 - Flappy Bird 03
- DNS的域名的解析解决办法(openDNS)
- FL Studio中的音频剪辑功能
- MySQL查询不同年份母亲节_历年母亲节谷歌doodle有什么不同 google母亲节logo变化史...
- SAGA GIS英文版进行地形分析,计算常用的地形因子等
- HYPER-V RTM版安装
热门文章
- 山穷水尽疑无路,柳岸花明又一村
- 完全背包 nyoj311
- 算法:最优二叉搜索树
- Trimble接收机T02格式转RINEX
- 概率统计在计算机中的重要性,概率论与数理统计在数一、数三中的重要性
- 华为云WeLink云空间,企业的多啦A梦「百宝袋」办公助手
- QT 显示USB摄像头数据
- 2021年危险化学品生产单位安全生产管理人员考试内容及危险化学品生产单位安全生产管理人员考试技巧
- 如何快速查询python中的关键字
- 美杜莎编译安装报错:checking build system type... Invalid configuration `x86_64-unknown-linux-‘: machine `x86_