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的工作原理:
- 准备建立会话时,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的设置,将其存储到数据库中(加快查询速度)。
- HDUOJ---2152
- nyoj-----D的小L
- HDUOJ---The Moving Points
- HDUOJ---------Kia's Calculation
- HDUOJ----Good Numbers
- DP较为完整的知识
- HDUOJ----The Number Off of FFF
- HDUOJ-------Naive and Silly Muggles
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 【s3cmd】给s3cmd加点debug日志再编一个
- Linux获取当前脚本真实路径的方法
- 短视频商城源码,商城左侧菜单栏网页模板
- 谈一谈Linux系统重要的子目录问题
- Tensorflow 2.x Java api的maven包怎么找
- Linux上也有10个流行的Windows应用程序
- (译)SDL编程入门(14)动画精灵和VSync
- 在Ubuntu Linux上安装和使用Git和GitHub
- 10个好用的 HTML5 特性
- Linux下升级python和安装pip的详解
- Linux中使用top命令的技巧
- Linux中查找工具的友好替代方案
- 使用命令行检测Ubuntu版本方法
- 一键实现 PowerBI 度量值批量重命名
- Ubuntu E: 无法获得锁 /var/lib/dpkg/lock-frontend – open (11: 资源暂时不可用)