Cookie和Session 详解

来源:互联网 发布:java全局map 编辑:程序博客网 时间:2024/05/23 02:04

一、Cookie详解

Cookie是存储在客户端(一般指浏览器)的一段小数据,客户端通过HTTP协议与服务器进行Cookie交互。

在PHP中通过 setcookie() 函数来设置cookie ,但实质上php并没有设置cookie,他只是发出指令通知浏览器来做这件事。

setcookie() 介绍 :setcookie()函数


在使用setcookie时需注意:

1.在之前不能有任何输出,跟header()一样;

2.由php在当前页面设置的cookie不能立即生效,要等到下个页面才能看到;

3.cookie没有显示的删除函数,要删除cookie只能通过设置cookie让它过期;

4.如果不设置过期时间,cookie会在会话结束(即浏览器关闭)时过期并被清除。

5.如果设置了过期时间,cookie不会随着浏览器关闭而失效

6.出于安全考虑,httponly参数要设置为true ,即不让浏览器来操作cookie;限制domain 和 path 的有效范围;


Cookie分为两种:

1.以文件形式存在硬盘空间上的长期cookie。

要让cookie以文件的形式长期保存就必须在用setcookie设置cookie时指定过期时间。

禁用浏览器cookie指对这种形式的cookie有效。

2.停留在浏览器所占用内存中的临时性Cookie。

如果没有对cookie设置过期时间,那么cookie就不会以文件的形式保存在硬盘上,而是保存在内存中。当浏览器关闭后,cookie就会消失。对于这种形式的cookie就算浏览器禁用cookie也是没有效果的。


以前错误的以为session的有效期是到浏览器关闭后就停止了,其实不然。服务器创建session同时会在客户端生成一个名为PHPSESSID的cookie保存sessionID ,如果没对这个cookie设置有效期的话,他是保存在内存中的,所以当浏览器关闭后他也就消失了。如果对他设置了有效期,他就会保存到硬盘中,就不会随着浏览器的关闭而消失:

session_start();$_SESSION['user'] = 'Eric';setcookie(session_name(),session_id(),time()+3600);
所以session的生命周期可以通过这种方式设置。

PS:火狐浏览器cookie保存路径:C:\Documents and Settings\磐石文印\Application Data\Mozilla\Firefox\Profiles\7hg4wsia.default\cookies.sqlite     


Cookie应用示例:

1.自动登录:

当选中自动登录时,把用户名和密码用cookie的形式长期保存在客户端,下次登录的时候用传递过来的cookie跟数据库进行匹配。


火狐浏览器禁用Cookie方式:


查看Cookie方式:





二、Session详解:

Session工作原理:

当session启用时(session_start())服务器会通知客户端生成一个名为PHPSESSID的cookie保存sessionID,并在服务器的D:\xampp\tmp (该目录在php.ini中配置)下生成一个文件保存session值,文件名默认由‘sess_’+sessionID 构成 ,每次请求客户端的cookie都会通过http传递到服务器,用来匹配服务器的session文件。

Session的PHP创建方式:

session_start();$_SESSION['user'] = 'Eric';setcookie(session_name(),session_id(),time()+3600);

Session的存储方式:

默认情况下,session是以文件形式保存在硬盘的一个目录中的,所以当session比较多时,磁盘的读取速度会比较慢。一般情况下,一个目录的文件数超过2000,时读取速度就会很慢。所以要把session分目录存放。

php.ini 有一项:session.save_path = "N;MODE;/path"   。这项设置可以给Session存放目录进行多级散列,其中‘N’ 表示要设置的目录级数,‘MODE’ 表示目录的权限属性,默认600。‘/path’ 表示session文件的存放目录。

Session的回收:

session的回收是被动的,为了保证过期的Session能被回收,可以修改php.ini 中的session.gc_divisor = 100来提高回收效率。对于设置分级目录的session,php不会自动回收,需要自己实现回收。

Session入库:



0 0