Session技术是网站技术中不可或缺的一个重点。主要用户跟踪用户的登录信息,实现跨页面传值。为了讲解会话控制,首先也是给同学们展示效果。如果网站地址被公开,如果没有使用session技术的页面一定会被任何人访问,而根本没有安全性可言。如果使用session,则起到了页面访问权限的问题。为了激起同学们的兴趣,以QQ帐号登录为例子,如果同一个帐号在多地被使用,后者将前者踢下线。如何做到的呢?先让大家思考,然后讲解SESSIONID的概念。
具体讲解内容如下:
示例代码如下:
n 会话控制的概念:
简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量,系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。目前最主要的会话跟踪方式有cookie,session。
n Cookie的概念:
cookie是一种在远程浏览器端存储数据并以此数据来跟踪和识别用户的机制。
cookie可以简单地理解为是用户访问某个网站,web服务器暂时存储在用户硬盘上的一个文本文件,当用户再次访问该网站,浏览器会通过读取客户端cookie文件记录来查看访客的特定信息,从而迅速做出响应,比如在页面中可以不需要输入用户名和密码就直接登录网站等等。当然这么理解的前提是不考虑会话cookie,因为会话cookie不将用户信息储存在硬盘上,而是仅仅存储在内存中,当当前页面关闭而随之消亡。
cookie常常被用于三个方面:
1. 记录用户访问的部分信息:比如用户访问该页面的次数,上次访问的时间,上次登录的用户名等。
2. 在页面间传递变量:当一个页面声明了一个变量,并赋值后,一旦该页面关闭,则该变量的值也随之消失,如果需要该变量传值到下一个页面,可以通过表单、url地址传值外,还可以通过cookie传递。
3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。
n 创建cookie:
setcookie(stringcookiename , string value , int expire);
1. cookiename是需要设置的cookie的名字,将来需要调用时可以通过$_COOKIE[cookiename]来获取其中的值;
2. expire为cookie的失效时间,是标准的UNIX时间标记,如果不设置失效时间,那么cookie的生命周期就是浏览器会话期间,一旦这个页面关闭了,相应的cookie也就自动消失。这种cookie就是会话cookie,它不会被保存在硬盘上,而是只保存于内存中。
例如:setcookie('visitcount', $count , time()+60);
有效时间一般是当前时间戳加需要延长的时间秒数。本例意思是名字是visitcount的cookie的有效时间为60秒。当前时间戳可以通过time()/mktime()来获取。
特别备注:cookie是HTTP文标的组成部分,而头标必须在页面任何内容发送之前发送,也就是说必须最先输出,即便是在setcookie()前输出了一个html标记或者echo语句都不可以,甚至连一个空行都导致程序错误。
n 读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。
例如:欢迎您第 <?php echo $_COOKIE[visitcount] ?> 次访问本页面。
n 删除cookie:有两种方法:
1.手工删除方法:右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。
2.setcookie()方法:跟设置cookie的方法一样,不过此时讲cookie的值设置为空,有效时间为0或小于当前时间戳。
例如:setcookie('visittime' , '' , 0);
setcookie('visittime' , '' , time()-1);
n cookie的生命周期:
1. 没有设置有效期的cookie:
没有设置有效期的cookie也就是会话cookie,该cookie不会被保存成硬盘中的txt文件,而是保存在内存中,一旦当前浏览器窗口关闭,则cookie自动消失,也就是该cookie的生命周期结束。
2. 设置了有效期的cookie:设置了有效期的cookie会保存到硬盘COOKIES目录下的txt文件中。只有当到期或者手工删除才会消亡。
3. 虽然cookie可以长期保存在客户端浏览器中,但浏览器允许存储最多300个cookie文件,而且每个cookie文件的最大容量为4kb;此外每个域名也最多支持保存20个cookie,如果达到了限制,那么浏览器会自动随机删除cookies。
n cookie的综合应用:网页访问计数器。
- if(!empty($_COOKIE[visitcount])){
- $count = $_COOKIE[visitcount] + 1;
- } else {
- $count = 1;
- }
- setcookie('visitcount' , $count , time() + 3600*24);
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>体验cookie用法</title>
- </head>
- <body>
- <span style="white-space:pre"> </span>您第 <?php echo $count ?> 次访问该页面<br/>
- </body>
- </html>
n cookie的更多参数:
bool setcookie ( string name [, string value [, int expire [,string path [, string domain [, bool secure]]]]] )。
setcookie() 参数详解
参数
说明
举例
name
Cookie 的名字。
使用 $_COOKIE['cookiename'] 调用名为 cookiename 的 cookie。
value
Cookie 的值。此值保存在客户端,不要用来保存敏感数据。
假定 name 是 'cookiename',可以通过 $_COOKIE['cookiename'] 取得其值。
expire
Cookie 过期的时间。这是个 Unix 时间戳,即从 Unix 纪元开始的秒数。换而言之,通过time()函数再加上秒数来设定 cookie 的失效期。或者用mktime()来实现。
time()+60*60*24*30 将设定 cookie 30 天后失效。如果未设定,cookie 将会在会话结束后(一般是浏览器关闭)失效。
path
Cookie 在服务器端的有效路径。
如果该参数设为 '/' 的话,cookie 就在整个 domain 内有效,如果设为 '/foo/',cookie 就只在 domain 下的 /foo/ 目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录。
domain
该 cookie 有效的域名。
要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为 '.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。如果该参数设为 www.example.com 的话,就只在 www 子域内有效。
secure
指明 cookie 是否仅通过安全的 HTTPS 连接传送。当设成 TRUE 时,cookie 仅在安全的连接中被设置。默认值为 FALSE。
0 或 1
使用cookie的重要注意事项:
因为cookie是通过客户端浏览器来保存的,在ie浏览器中,如果浏览器的隐私设置为阻止所有cookie,那么cookie则被禁用。如果想让setcookie()正常发挥作用,浏览器隐私需要设置为中高或者以下。
Session的概念:
必须思考的问题:【非常重要】
1. 如果setcookie('username', '' ,time()+3600),将一个空值赋值给cookie,能否产生cookie文件?
2. 如果setcookie('username', ' ' ,time()+3600),将一个空格赋值给cookie,能否产生cookie文件?如果产生cookie文件,cookie文本文件中的内容又会是什么?
3. 如果setcookie('username' , '蓝星福' ,time()+3600),请查看cookie文本文件中内容,是否还是中文“蓝星福”?(提示:urlencode)
4. 如果在一个页面中先setcookie('username' , '蓝星福' ,time()+3600),然后$_COOKIE['username'] = 'lanxingfu',那么cookie里的值被修改了吗?请在当前页面输出$_COOKIE['username'],然后再在另一个页面输出$_COOKIE['username']。分析为什么?
Session的使用步骤:
1. 启动session:使用session_start()函数来启动。
2. 注册会话:直接给$_SESSION数组添加元素即可。
3. 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。
4. 删除会话:
A. 可以使用unset删除单个session;
B. 使用$_SESSION=array()的方式,一次注销所有的会话变量;
C. 使用session_destroy()函数来彻底销毁session。
对删除会话的三种方式比较:
A. unset可以将session值从session文件中清除,但是该session文件依然存在;在同一个页面,unset一个session值后,立刻输出该session值,无法获得内容。
B. $_SESSION=array()的方式也是将session值从session文件中清除,但是该session文件依然存在;在同一个页面,通过$_SESSION=array()删除所有session后,立刻输出session值,无法获得内容。
C. session_destroy()可以将session的保存文件进行删除。在同一个页面,session_destroy()销毁session后,立刻输出该session值,还依然可以输出session的内容,当刷新后则无法获得内容。
因此,为了彻底清除session,一般先$_SESSION=array(),然后再session_destroy()。
Session的综合应用:当用户登录成功后,必须应用Session技术来跟踪登录信息。此外需要同时将验证码图片生成进行复习。因为验证码图片生成过程中利用到了Session技术的跨页面传值的特性。
Session和Cookie的区别:
cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时cookie值依然有效。
session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是哪个用户的。
Session和Cookie两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。