PHP中的会话控制

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

  • 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了
  • 无状态:每个请求都是独立的,服务器无法识别和区分它们的身份

这就造成了一个问题,在不同网页之间如何传递信息,会话控制的思想就是为了解决这个问题的,它的解决方案主要分为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=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的设置,将其存储到数据库中(加快查询速度)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

Redis慢日志+扩展模块+存储session+主从配置

3725
来自专栏用户2442861的专栏

mysql table相关命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

442
来自专栏开源优测

工具篇 - HTTP协议报文结构及示例03

前言 从事性能测试必不可绕过的就是协议,对基本知识的了解也还,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手。 下面我们就HTTP协议及性能测...

3428
来自专栏ml

caffe安装过程中遇到的问题以及解决方法

1. 在安装依赖库的时候,遇到: @gxjun-Latitude-E5440:~$ sudo apt-get install libatlas-base-de...

3177
来自专栏开源优测

HTTP协议报文结构及抓包报文分析示例

前言 从事性能测试必不可绕过的就是协议,对基本知识的了解,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手。 下面我们就HTTP协议及性能测试过...

3205
来自专栏大魏分享(微信公众号:david-share)

新一代企业应用平台的探究(上):只拿干货说话

1092
来自专栏九彩拼盘的叨叨叨

超文本传输协议(HTTP)介绍

超文本传输协议(HyperText Transfer Protocol,HTTP)是从服务器传输数据到客户端的传输协议。

482
来自专栏云计算教程系列

如何在CentOS上安装MySQL

MySQL是一种流行的数据库管理系统,用于Web和服务器应用程序。本教程将介绍如何在CentOS 6上安装,配置和管理MySQL。

1017
来自专栏java一日一条

web中缓存的几种方式

应用程序把动态文件生成的html文件缓存到文件服务器,以后用户请求动态文件,直接从文件服务器加载对应的静态缓存的html文件返回给用户,这里面主要节省了动态语言...

362
来自专栏容器云生态

Moosefs分布式文件系统集群讲解配置

MFS的官方网站为http://www.moosefs.org ,详细信息您可以去官网进行更多的了解,在这里我只将简单的知识和大家分享。 MFS的网络组成有三部...

2495

扫描关注云+社区