PHP中的会话控制

刺探HTTP(超文本传输协议)能够知道,它接纳请求与响应的情势,最大的特色就是无连接无状态。

  • 无连接:每趟一连仅处理2个客户端的请求,获得服务器响应后,连接就终止了
  • 无状态:每一种请求都是单身的,服务器不恐怕分辨和差别它们的地位

图片 1

 

那就招致了2个标题,在分裂网页之间怎么样传递消息,会话控制的合计就是为了化解那个标题标,它的消除方案首要分为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使用$_CEOKIE,更新和删除均选取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=new Date();
      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(';')
    var res;
    for(var i=0,l=resArr.length;i<l;i++){
      var arr=resArr.split('=');
      if(arr[0]===key){
        res=arr[1];break;
      }
    }
    return unescape(res);
  }
}

 

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

<?php
define('GAVIN', true);//权限标示常量,申明后方可引入文件
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的办事规律:

  1. 绸缪未雨建立会话时,PHP首先查看请求的cookie中是或不是带有session_id,假设没有则开创一条session消息(一般以文件方式存在服务器上)。
  2. 服务器将新创立session消息的session_id发送给浏览器,一般浏览器将其存放在cookie中。
  3. 当浏览器再一次访问服务器时,会带领那些session_id,凭借此到服务器session认领对应新闻。
  4. 撤回会话,能够去除服务器中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的设置,将其储存到数据库中(加速查询速度)。

 

相关文章