PHP会话处理——Cookie和Session
遇到的问题:
我们希望实现单点登录SSO,即用户只需一次登录,网站的所有网页都将记住用户的登录信息。但HTTP是一种无状态协议,也就是说每次请求都是独立的,与上一次或下一次请求无关。这就要求程序实现多个页面之间的信息传递。
解决方法:
1. GET和POST
即在每个页面跳转的时候传递用户信息。我们可以想象这个方法多么的耿直,会花费大量的时间在编写跳转时的信息传递上,而且在跳转频繁时难以保证没有遗漏。
2. 将信息存储在文件中
将用户信息存储在某个文件中
file_put_contents("reg.txt", $username);
每个页面都可以访问这个独立的文件,并提取出其中的信息来识别目前用户的身份
file_get_contents("reg.txt");
但问题在于页面可能有多个用户访问,多个用户对一个文件进行修改和查看,无疑会出现混乱。
3. cookie
cookie是由服务器生成,存放在客户端的用户信息。当用户请求网页时,就会将这些信息一并带过去,网页会根据HTTP请求中head所包含的cookie信息来识别用户身份。
cookie的生成:
$time=time()+60*60*24*7; //cookie的失效时间
setCookie("username", $_POST["name"], $time); //设置cookie中变量username的值
setCookie("uid", $row["id"], $time);
setCookie("isLogin", 1, $time); //设置cookie,1表示用户已经登录
cookie的使用
我们可以通过php的超级全局变量来访问cookie值
print_r($_COOKIE); //将打印出cookie的内容
我们可以在每个页面的开始加入这段代码
//判断用户是否登录,若没有则强制返回登陆界面
if(!$_COOKIE["isLogin"]){
header("Location:login.php");
}
cookie的销毁
setCookie
函数不仅能生成也能销毁cookie,思路就是使cookie到期,或将信息设为空。
setCookie("uid", '', time()-3600); //通过把失效日期设置为过去的日期/时间,删除一个cookie
总结: cookie好比是商场颁发给用户的会员卡,用户只要出示此卡就可以在商场任一店面享受服务。缺点就是cookie数据存放在客户端,不安全(会员卡容易丢),于是有了接下来的Session。
4. Session
既然“会员卡容易丢”,那么我们可以委托商场代为保管,而用户记住自己的“会员卡号”,依然可以在商场里畅行无阻。这个方法就是session。
Session的数据保存在服务器端,仅将SessionID颁发给用户,用户在请求中附带SessionID,网页依然可以识别用户。
根据SessionID存放的位置,分为基于Cookie的和基于URL的,以下介绍基于Cookie的,即SessionID存放在cookie中的Session。
Session的生成
session_start(); //使用Session,必先启动Session
echo session_id()."<br>"; //显示SessionID
echo $_COOKIE[session_name()]; //显示cookie中的session名
//设置session数据内容
$_SESSION["username"]=$_POST["name"];
$_SESSION["uid"]=$row["id"];
$_SESSION["isLogin5"]=1;
Session的使用
可以使用php超级全局变量访问Session内容
echo "用户<b>".$_SESSION["username"]."</b>您好, 这是网站首页!";
可以在每个页面的开始加入这段代码
session_start(); //若sessionID存在则将连接到已有session,若无则新分配一个
//判断用户是否登录,若没有则强制返回登陆界面
if(!$_SESSION["isLogin"]){
header("Location:login.php");
}
Session的销毁
//开启SESSION
session_start();
//清空SESSION值
$_SESSION=array();
//删除客户端的在COOKIE中的Sessionid
if(isset($_COOKIE[session_name()])){
setCookie(session_name(), '', time()-3600, '/');
}
//彻底销毁session
session_destroy();