session是服务器端的一种会话机制,当客户端的请求服务器建立一个session时,服务器会先检测该请求里面是否包含一个唯一的sessionID,若是是,说明服务器已经为该用户建立过session,只要按照该sesionID检索出该用户的session供用户使用,若是没有sessionID,服务器会为该用户新建一个带有惟一表示服sessionID的session。建立完成后,该sessionID会被服务器返回给客户端,保存到客户端本地。 php
通常保存该session ID的机制是Cookie,可是因为Cookies能够被人为禁止,这就得保证Cookies被禁止以后,仍旧能够经过session进行会话,通常是经过url重写进行,51Testing软件测试网 e U(x/s%W z表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,另外一种是做为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764这两种方式对于用户来讲是没有区别的,只是服务器在解析的时候处理的方式不一样,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
为了在整个交互过程当中始终保持状态,就必须在每一个客户端可能请求的路径后面都包含这个session id。
*s5t3v V6[ \51Testing软件测试网)C/tQ&^ V U!B:V2W 浏览器
另外是关于session失效的误区: 服务器
在谈论session机制的时候,经常听到这样一种误解“只要关闭浏览器,session就消失了”。其实能够想象一下会员卡的例子,除非顾客主动 对店家提出销卡,不然店家绝对不会轻易删除顾客的资料。对session来讲也是同样的,除非程序通知服务器删除一个session,不然服务器会一直保 留,程序通常都是在用户作log off的时候发个指令去删除session。然而浏览器历来不会主动在关闭以前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭,之所 以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次链接服务器时也就没法找到原来的session。若是服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然可以找到原来的session。51Testing软件测试网 b'w y0Z7B i9Y G cookie
51Testing软件测试网 V w Bw*_~;yK U session
偏偏是因为关闭浏览器不会致使session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就能够认为客户端已经中止了活动,才会把session删除以节省存储空间。 测试
好了,废话说了一大堆,说session丢失的解决办法吧: url
一、session_start();应该尽可能放置到页面的顶部; spa
二、若是php.ini里面没有配置 session Autostart的话,每次会话以前,都得手动开启session:session_start(); code
三、session是php里面的超全局变量,跟$_GET,$_POST,$_SERVER同样,因此使用的时候必须大写:$_SESSION['username']=$username; 字符串
四、跨页面传递示例:a.php页面传递$_SESSION['username']到b.php:
a.php:
<?php session_start(); $username=$_POST['username']; $_SESSION['username']=$username; ?>
b.php
<?php session_start(); echo $_SESSION['username']; ?>