四、会话控制(session与cookie)

4.1 cookie简介

cookie是保存在客户端浏览器上的数据,我们通过cookie来跟踪与存储用户数据,一般情况下,cookie通过http headers从服务端返回到客户端,多数web程序都支持cookie的操作,因为cookie是存在于http标头之中,所以必须在其他信息输出以前进行设置,类似于heade函数的使用限制。

php通过setcookie函数进行cookie的设置,任何从浏览器发回的cookie,php都会自动存储在 $_COOKIE 的全局变量中,可以通过 $_COOKIE["key"] 的形式读取cookie的值。

php中cookie使用非常广泛,进程用来存储用户的登陆信息,购物车等,在使用session时候经常使用cookie来存储会话id来识别用户,cookie具有有效期,有效期结束后cookie会自动从客户端删除。为了更好的进行安全控制,cookie还可以设置域跟路径。

4.2 设置cookie

php设置cookie最常用的方法是使用setcookie函数,setcookie具有7个可选参数,常用为前5个:

name(cookie名称):可以通过$_COOKIE['NAME']进行访问

value(cookie的值)

exprie(过期时间):Unix时间戳格式,默认0,标识浏览器关闭后失效

path(有效路径):若设置为'/'则整个网站都有效

domain(有效域):默认整个域名有效

php中还有一个设置cookie的函数setrawcookie,setrawcookie与setcookie基本一样,唯一区别就是value值不会自动进行urlencode,因此使用时需要手动进行urlencode。

因为cookie是用过http标头进行设置的,所以也可以使用header方法进行设置。

header("Set-Cookie:cookie_name=value");

4.3 cookie的删除与过期时间

在php中删除cookie也是采用setcookie来实现,将过期时间设置到当前时间之前则该cookie自动失效。

setcookie('test','',time()-1);

也可以通过header来删除cookie

header("Set-Cookie:test='';expires=".gmdata('D,d M Y H:i:s \G\M\T',time()-1)");

这里用到了gmdate,用来生成格林威治标准时间,以便排除时间差影响。

4.4 cookie的有效路径

cookie中的路径控制来控制设置cookie在哪个路径下有效,默认为'/',在所有路径下有效,当设置了其他路径过后则只在设定的路径已经子路径下有效。

一般情况下大多是使用所有路径,只有在极少数有特殊需求时会设置路径,这种情况下只在指定的路径中才回传递cookie值,可以节省数据的传输,增强安全性以及提高性能。

4.5 session与cookie的异同

cookie存储在客户端,建立起用户与服务器之前的联系,通常可以解决很多问题,但同时存在一些局限

1、cookie相对不是太安全,容易被盗用导致cookie欺骗

2、单个cookie的值最大只能存储4k

3、每次请求都需要进行网络传输,占用宽带

session将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,php默认情况下session_id是通过cookie来保存,也可以通过参数来实现,只要能将session_id传递到服务端进行识别的机制都可以使用session。

//开始使用session
session_start();
//设置一个session
$_SESSION['TEST']="VALUE";
//显示当前session_id
echo session_id();
//读取session值
echo $_SESSION['TEST'];
//销毁一个session
unset($_SESSION['TEST']);

4.6 使用session

在php中使用session非常简单,先执行 session_start() 方法开启session,然后通过全局变量 $_SESSION 进行session读写。

session会自动对设置的值进行encode和decode,因此session可以支持任意数据类型,包括数据与对象等。

默认情况下,session是以文件的形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行等待,可以采用缓存或者数据库的形式存储来解决这个问题。

4.7 删除与销毁session

删除某一个session可以使用php中的unset函数,删除后会从全局变量$_SESSION中去除

要删除所有session,可以使用 session_destroy(); 函数销毁当前session,session_destroy函数会删除所有数据,但是session_id仍然存在。

session_destroy并不会立即销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,如果需要立即销毁$_SESSION,可以使用unset函数

如果需要同时销毁cookie中的session_id,一般做退出操作会使用到,可以显式的调用setcookie方法删除session_id的cookie值。

4.8 使用session来存储登陆信息

session可以存储多种类型的数据,常用来存储登陆数据,购物车数据等等。

一般来说登陆信息既可以存在cookie中也可以存在session中,差别在于session可以方便的存储多种数据类型,而cookie只能存储字符串类型,,同时对于一些安全性较高的数据cookie需要进行格式化加密存储,而session存储在服务端安全性更高。

php中使用base64进行加密:

$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));

php使用base64解密

$secureKey = 'imooc'; //加密密钥
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
最后修改:2019 年 03 月 16 日
如果觉得我的文章对你有用,请随意赞赏