会话控制、cookie、sessions

HTTP协议

HTTP是无状态的协议
HTTP协议没有内建机制来维持两个事务间的状态,无法判断在请求一个页面后再请求另外一个页面时是来自同一用户。

会话控制的思想是指能够在网站中根据一个会话跟踪用户。

作用:用户登录的支持
根据授权级别和个人喜好显示相应的内容。
实现购物车功能

实现原理:
通过一个唯一会话ID来驱动的。会话ID是一个加密的随机数字。由PHP生成,在会话的生命周期中都会保存在客户端。保存在用户机器里的cookie中,通过URL在网络上传递。

经典方案

上次登录时间
上次浏览信息
规定时间内,不用反复登录

如果没有设置时间,cookie不会保存到客户端,浏览器的会话结束,我们的cookie就失效了
cookie只能保存字符串 《在此电脑记住用户名》
对于中文,cookie会进行urlencode编码,我们可以使用urldecode解码
cookie保存的时间可以不一样,虽然是在一个文件内
cookie信息是通过http协议传递的

如果需要保存密码,最好使用md5加密

增加、更新、删除

setcookie('username','uiste',time()+60);

1
2
3
4
5
6
7
8
9
10
if (isset($_COOKIE["user"])) {
echo "当前COOKIE是:".$_COOKIE["user"];
echo "正在清楚cookie<br>";
setcookie("user","uiste",time()-3600);
}else{
echo "您设置的COOKIE时间已超时<br>";
echo "正在创建COOKIE<br>";
setcookie("user","uiste",time()+5);
echo "cookie 创建成功有效时间为5秒<br>";
}
1
2
3
4
5
6
7
8
date_default_timezone_set("Asia/Shanghai");
if (isset($_COOKIE['time'])) {
echo "您上次登录的时间是".$_COOKIE['time'];
setcookie('time',Date("Y-m-d H:i:s",time()));
}else{
echo "您是第一次登录,登录时间:".Date('Y-m-d H:i:s',time());
setcookie('time',Date("Y-m-d H:i:s",time()));
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<form action="" method="post">
用户名:<input type="text" name="username"><br>
密 码: <input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
<?php
if ($_POST) {
$username = $_POST['username'];
$password = mysql_real_escape_string($_POST['password']);
require '../inc/conn.php';
$sql = "select * from cookie where username='$username' and password='$password'";
$res = mysql_query($sql);
if (mysql_fetch_assoc($res)) {
echo "登录成功";
//登录成功就设置session
session_start();
$_SESSION['username']=$username;
$_SESSION['password']=$password;
echo $_SESSION['username'];
}else{
echo '用户名或密码错误,请重新登录';
}
}
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
header("content-type:text/html;charset=utf8");
session_start();
if (empty($_SESSION['username'])) {
echo "你没有登录请重新登录<br>";
echo "<a href='hw1_form.php'>登录</a>";
}else{
echo "可以购物";
echo "<hr>以下内容是退出功能的实现";
echo "<hr>兄弟不好意思,既然成功了我就要给你清除session了<br>";
echo '清除session一共两步<br>第一步:注销变量<br>第二步:销毁会话<br>';
unset($_SESSION['username']);
session_destroy();
}
?>

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;

echo “

以上解决方案为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的生命周期是访问即重新计算