Session详解
Posted 童凌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Session详解相关的知识,希望对你有一定的参考价值。
Session详解:
Session即回话,指一种持续性的、双向的链接。Session和Cookie在本质上没有什么区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器之间保持回话链接状态的机制。
Session的实现可以有很多种,比如URL重写、Cookie,通过在Cookie中存储SessionID实现Session传递。
1、Session的基本概念以及设置
和Cookie一样,Session也是一个通用标准,但是在不同的语言中实现有所不同。由于其广泛的应用型,php作为一种Web开发语言,完全支持Session机制。针对Web网站来说,Session指用户在浏览某个网站时,从进入网站到浏览器关闭这段时间内的对话。由此可知,Session实际上是一个特定的时间概念。使用Session可以在网站的上下文不同页面直接传递变量、用户身份认证,程序状态记录等。常见的形式是配合Cookie使用,实现保存用户登录状态功能。和Cookie一样,Session_start()必须在程序最开始之前执行,前面不能有任何输出内容,否则就会出现以下警告:
Warning:Cannot send Session Cookie - headers already sent
类似这样的警告信息通常是因为当前页面被包含或者包含了BOM头。
PHP的Session默认通过文件的方式实现,即存储在服务器端的Session文件,每个Session一个文件。
Session的工作原理:
我们看到,HTTP协议本身并不能支持服务器保存客户端的状态信息,为了解决这一个问题,于是引入的Session概念,用来保存客户端的状态信息。
Session通过一个成为PHPSESSID的Cookie和服务器联系。Session是通过SessionID判断客户端用户的,即Session文件的文件名。
用一个形象的比喻解释Session的工作方式。假设Web Server是一个商场的存包处,一个顾客(HTTP Request)第一次来到存包处,管理员把顾客的物品存放到某个柜子里面(这个柜子相当于Session),把一个号码牌交给这个顾客,作为取包凭证(这个号码牌就是SessionID)。顾客下一次来的时候,要把号码牌交给存包处的管理员。管理员根据号码牌找到相应的柜子,根据顾客的请求,取出或者更换,添加柜子里面的物品,存包处也可以让顾客的号码牌和号码牌对应的柜子失效。顾客的忘性很大,管理员在顾客回去的时候都要提醒顾客记住自己的号码牌,这样,顾客下次来的时候,就会带着号码牌回来。
SessionID 实际上是在客户端和服务端之间通过HTTP Request 和HTTP Response 穿来穿去,Session ID按照一定的算法生成,必须包含在HTTPRequest里面,保证唯一性和随机性,以保证Session的安全。如果没有设置Session的生存周期,Session存储在内存中,关闭浏览器后该ID自动注销;重新请求该页面,会重新注册一个SessionID,如果客户端没有禁用Cookie,Cookie在启动Session回话的时候扮演的是存储SessionID和Session生存期的角色。可以手动设置Session的生存期:代码如下:
$lifetime = "24*3600"; //24小时
setCookie(Session_name(),Session_id(),time() + lifeTime, "/");
也可以是通用Session_set_Cookie()函数设置Session的生存期,Session过期后,php会对其进行回收。因此,Session并非都随着浏览器的关闭而小时的。
假设客户端禁用Cookie怎么办?没办法,所有生存周期都是浏览器进程,只要关闭浏览器。再次请求页面又要重新注册Session。
那怎么传递SessionID呢?通过URL或者隐藏表单。
Cookie与Session问答:
Q1:Cookie运行在客户端,Session运行在服务器端,对吗?
A:不完全正确。Cookie运行在客户端,由客户端进行管理;Session虽然是运行在服务器端,但是SessionID是作为一个Cookie存储在客户端的。
Q2:浏览器禁止Cookie,Cookie就不能用了,但是Session不会受到浏览器影响,对吗?
A:错。浏览器禁止Cookie,Cookie确实不能用了,Session会受到浏览器的影响,很简单的实验,在登录一个网站后,清空浏览器的Cookie和隐私数据,单击后台的连接,就会因为丢失Cookie而退出。当然,有办法通过URL传递Session。
以上是关于Session详解的主要内容,如果未能解决你的问题,请参考以下文章