php会话控制是什么意思,PHP中的会话控制

了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态。

无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了

无状态:每个请求都是独立的,服务器无法识别和区分它们的身份

327498bdccdde0f3f03d1bbc3b1b261d.png

这就造成了一个问题,在不同网页之间如何传递信息,会话控制的思想就是为了解决这个问题的,它的解决方案主要分为Cookie和Session。

一、Cookie

保存在客户端中,又分为内存cookie和硬盘cookie。

内存cookie:由浏览器维护,保存在内存中,浏览器关闭之后就消失了,存在时间短暂

硬盘cookie:保存在硬盘中,有一个过期时间,仅手动删除或过期才消失

Cookie的使用场景主要有记住登录,购物车等,在PHP中操作cookie主要通过setcookie和setrawcookie两个方法来设置。

setcookie(name,value,[expire],[path],[domain],[secure],[httponly])

name 必需。名称。

value 必需。值。

expire 可选。有效期。

path 可选。服务器有效路径(默认当前路径)。

domain 可选。作用域(默认本域)。

secure 可选。仅HTTPS可用(默认false)。

httponly可选。仅http可访问(默认false),防止JS修改,减少XSS攻击。

setcookie("abc","123",time()+3600)

读取cookie使用$_COOKIE,更新和删除均使用setcookie方法,注意保证path和domain与之前一致,删除设置过期即可,如time()-1。

还可以通过header设置cookie:

header("Set-Cookie:abc=123; expires=".gmstrftime("%A,%d-%b-%Y %H:%M:%S GMT",time()+3600));

通过JS操作cookie的值,下面是一个封装的实例:

var Cookie={

set:function(key,val,expire){//判断是否设置了过期时间

if(expire){var date=newDate();

date.setTime(date.getTime()+expire*24*3600*1000);//格式化时间

var expireStr="expires="+date.toGMTString()+';';

}else{var expireStr='';

}

document.cookie=key+'='+escape(val)+';'+expireStr;

},

get:function(key){var getCookie=document.cookie.replace(/[ ]/g,'');//去空格

var resArr=getCookie.split(';')varres;for(var i=0,l=resArr.length;i

res=arr[1];break;

}

}returnunescape(res);

}

}

cookie实现自动登录,主要通过生成令牌存储到本地,下次访问时获取令牌中的id,查询数据库得到用户名和密码,加上掩值重新生成令牌与之比对,如相同则直接登录。

include("../include/Gavin.class.php");$username=$_POST['username'];$password=md5($_POST['password']);$autologin=$_POST['autologin'];

Gavin::connDb();$res = Gavin::dbSelect("SELECT * FROM main WHERE name='$username' and password='$password'");if(count($res)===1){if($autologin==="1"){setcookie("username",$username,strtotime('+7 days'));//给用户一个登录凭证

$salt='xiaoguge';//加密掩值

$tokens=md5($username.$password.$salt).":".$res[0][0];//拼接令牌:加密(用户名+密码+掩值)拼接用户id

setcookie("tokens",$tokens,strtotime('+7 days'));

}else{setcookie("username",$username);}echo Gavin::createJson(200,"登录成功!");

}else{echo Gavin::createJson(400,"登录失败,用户名或密码错误!");}?>

cookie的缺点:不够安全数据容易被截取;每个域名下大小有限制,cookie中最大字节数为4K;cookie每次都附着在http请求头中。

为了解决cookie在存储上的这些缺陷,HTML5提出了本地存储方案localStorage和sessionStorage。

二、session

session的工作原理:

准备建立会话时,PHP首先查看请求的cookie中是否包含session_id,如果没有则创建一条session信息(一般以文件形式存在服务器上)。

服务器将新创建session信息的session_id发送给浏览器,一般浏览器将其存放在cookie中。

当浏览器再次访问服务器时,会携带这个session_id,凭借此到服务器session认领对应信息。

取消会话,可以删除服务器中session的信息。

在PHP中使用会话,必须先使用session_start()开启,再使用$_SESSION进行设置和读取

session_start();$_SESSION['account']=$account;

删除session:

session_start();//将session数据清空

$_SESSION=[];//删除会话cookie

if(ini_get('session.use_cookie')){$params=session_get_cookie_params();setcookie(session_name(),'',time()-1,$params['path'],$params['domain'],$params['secure'],$params['httponly'])

}//销毁会话

session_destroy();

session默认是采用文件形式存储,当然也可也修改PHP的设置,将其存储到数据库中(加快查询速度)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值