PHP会话处理——Cookie和Session

PHP会话处理——Cookie和Session

遇到的问题:

我们希望实现单点登录SSO,即用户只需一次登录,网站的所有网页都将记住用户的登录信息。但HTTP是一种无状态协议,也就是说每次请求都是独立的,与上一次或下一次请求无关。这就要求程序实现多个页面之间的信息传递。

解决方法:

1. GET和POST

即在每个页面跳转的时候传递用户信息。我们可以想象这个方法多么的耿直,会花费大量的时间在编写跳转时的信息传递上,而且在跳转频繁时难以保证没有遗漏。

2. 将信息存储在文件中

将用户信息存储在某个文件中

file_put_contents("reg.txt", $username);

每个页面都可以访问这个独立的文件,并提取出其中的信息来识别目前用户的身份

file_get_contents("reg.txt");

但问题在于页面可能有多个用户访问,多个用户对一个文件进行修改和查看,无疑会出现混乱。

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值