HTTP协议
HTTP是无状态的协议
HTTP协议没有内建机制来维持两个事务间的状态,无法判断在请求一个页面后再请求另外一个页面时是来自同一用户。
会话控制的思想是指能够在网站中根据一个会话跟踪用户。
作用:用户登录的支持
根据授权级别和个人喜好显示相应的内容。
实现购物车功能
实现原理:
通过一个唯一会话ID来驱动的。会话ID是一个加密的随机数字。由PHP生成,在会话的生命周期中都会保存在客户端。保存在用户机器里的cookie中,通过URL在网络上传递。
经典方案
上次登录时间
上次浏览信息
规定时间内,不用反复登录
cookie
如果没有设置时间,cookie不会保存到客户端,浏览器的会话结束,我们的cookie就失效了
cookie只能保存字符串 《在此电脑记住用户名》
对于中文,cookie会进行urlencode编码,我们可以使用urldecode解码
cookie保存的时间可以不一样,虽然是在一个文件内
cookie信息是通过http协议传递的
如果需要保存密码,最好使用md5加密
增加、更新、删除
setcookie('username','uiste',time()+60);
1 | if (isset($_COOKIE["user"])) { |
1 | date_default_timezone_set("Asia/Shanghai"); |
session
实现简单的会话
开始一个会话
注册会话变量
使用会话变量
注销变量并销毁会话
作用:
购物车
用户信息
一个数据供同一用户不同页面使用
防止用户非法登录到某个页面
session可以保存的数据类型
整形、浮点型、字符串、布尔、数组、对象
注意
要使用session都需要初始化
key不能重复
如果要取出对象,需要事先声明类的定义
session文件创建是在session_start()执行后立即创建;
配置文件
《手册-附录-配置选项》
php.ini配置文件中有一组会话配置选项,可以对其进行设置。如下:
session.auto_start = 0 ; 在请求启动时初始化session
session.cache_expire = 180 ; 设置缓存中的会话文档在 n 分钟后过时
session.cookie_lifetime = 0 ; 设置按秒记的cookie的保存时间, 相当于设置Session的过期时间,为0时表示直到浏览器被重启
session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.name = PHPSESSID; 用在cookie里的session的名字
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.
session.use_cookies = 1 ; 是否使用cookies
需要重启Apache
这些步骤不一定都要发生在同一个脚本中,其中
1 | <form action="" method="post"> |
1 |
|
session与cookie的区别
cookie是把用户的信息写给用户的浏览器
session是把用户的数据写到用户都占的$_SESSION
中,存在服务器的某个路径文件中,只用session
时要先初始化session_start()
;
php.ini->session.auto_start=1
自动开启session不推荐
如果客户端禁用cookie怎样实现session多页面共享
在每个超链接上添加一个PHPSESSID=sessionid;
同时在每个页面加入:
if(isset($_GET[‘PHPSESSID’])){
//设置session_id;
session_id($_GET[‘PHPSESSID’]);
}
session_start();
使用系统内置常量:SID
;
以上解决方案为URL重写
解决非法登录问题
if($name!=’’){
session_start();
$_SESSION[‘username’]=$name;
header(“Location:登录成功页?name=$name”);
}
if(empty($_SESSION[‘username’])){
header(‘Location:login.php?error=1’);
}
垃圾回收机制
cookie默认关闭浏览器即失效
cookie的生命周期是固定的
session的生命周期是访问即重新计算