IT技术博客大学习 共学习 共进步

如何设置一个严格30分钟过期的Session

风雪之隅 2012-01-16 00:02:50 浏览 5,087 次

     我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识多着呢, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵

     为什么问这个问题呢? 1. 我在Twitter上看到了有人讨论这个问题, 2 想起来我经常问这个问题, 所以~~

     呵呵, 在这里, 我来解答下这个题目, 并且说明下, 在这个题目中要考察的基本功.

第一种回答

    那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下:

     1. 首先, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_divisor(介绍参看 深入理解PHP原理之Session Gc的一个小概率Notice), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

     2. 那设置一个大概率的清理机会呢? 还是不妥, 为什么? 因为PHP使用stat Session文件的修改时间来判断是否过期, 而一个Seesion使用一个文件, 如果增大这个概率一来会降低性能, 二来, 假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, 那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

     3. 其次, PHP默认的(Linux为例), 是使用/tmp作为Session的存储目录, 并且手册中也有如下的描述:

     Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

     所以, 第一种答案是不”完全严格”正确的.

第二种答案

    还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime. 这种回答也是不正确的, 原因如下:

     这个过期只是Cookie过期, 换个说法这点就考察Cookie和Session的区别, Session过期是服务器过期, 而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, 不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案

    使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案

    当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱, 所以一般来说, 标准的做法是:

     1. 设置Cookie过期时间30.

     2. 自己为每一个Session值增加Time stamp.

     3. 每次访问之前, 判断时间戳.

    最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠

建议继续学习

  1. 浅析http协议、cookies和session机制、浏览器缓存 (阅读 17,203)
  2. cookie窃取和session劫持 (阅读 14,423)
  3. 你必须了解的Session的本质 (阅读 11,245)
  4. 深入浅出Session攻击方式之一 – 固定会话ID (阅读 5,324)
  5. 关于session和memcache的若干问题 (阅读 5,184)
  6. (oracle)11g与10g中alter session权限差异 (阅读 4,384)
  7. Php session内部执行流程的再次剖析 (阅读 4,343)
  8. PHP Session学习笔记 (阅读 4,324)
  9. 深入理解PHP原理之Session Gc的一个小概率Notice (阅读 4,202)
  10. IFrame带来的Session问题 (阅读 3,944)