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的设置,将其存储到数据库中(加快查询速度)。
PHP中的会话控制的更多相关文章
- 理解PHP中的会话控制
会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...
- gin框架中的会话控制
Cookie介绍 Http协议是无状态的,服务器不能记录浏览器的访问状态,也就是说服务器不能判断请求的客户端是否已经登录 Cookie就是解决http协议无状态的方案之一 Cookie实际上就是服务器 ...
- PHP中的会话控制—session和cookie(实现数据传值功能)
1.session 登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器: (2)session每个人(登陆者)存一份: (3)session ...
- 理解PHP中会话控制
如果以前没有接触过建站或网络编程,只是从头开始学PHP,以及用PHP来建立动态站点,那么会话(SESSION)对于初学者就有点难理解.那么到底什么是会话呢?理解一个概念需要从它产生的背景或问题出发,所 ...
- WCF初探-26:WCF中的会话
理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...
- 会话控制:session与cookie
我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...
- (实用篇)php通过会话控制实现身份验证实例
会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...
- 会话控制:SESSION,COOKIE
1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...
- PHP之自定义会话控制---使用文件处理
前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...
随机推荐
- ES6中数组的新方法
数组的扩展 1.1扩展运算符 1.1.1:... 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. <body> < ...
- KICKSTART无人值守安装
1.1 环境说明 [root@test ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@test ~]# uname -r - ...
- 一次线上Mysql数据库崩溃事故的记录
文章简介 工作这几年,技术栈在不断更新,项目管理心得也增加了不少,写代码的速度也在提升,感觉很欣慰,毕竟是在一直进步,但是过程中也有许许多多的曲折,也踩过了数不尽的坑坑洼洼,从一个连百度都不知道用的萌 ...
- form提交地址地址正确但是依旧报错404找不到路径
---恢复内容开始--- 我的jsp中保含了">="和"<="符号,form提交的时候会有个标签校验,如下: private static bool ...
- 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新
如题: 在写后台管理系统时,需要实现后台界面的局部动态刷新. 左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...
- Java面试题技术类
目录 1.面向对象编程的三大特性是什么? 2.String 和StringBuffer的区别 3.说出ArrayList,Vector, LinkedList的存储性能和特性 4.Collection ...
- web前端vertical-align的作用及对象详解
很多程序员知道web前端技术里的vertical-align是什么意思,但是对于vertical-align到底以什么为对齐标准却一知半解,今天我们就来说说web前端vertical-align. 1 ...
- Node学习笔记 http
node url querystring 第二个参数指定分隔符 也可以指定三个参数,效果和两个参数类似 不同于querystring,下面是querystringfy的用法 queryescape与e ...
- Python之hashlib模块
hashlib 在做一个授权管理系统,需要生产动态生成密码,故使用hashlib >>> import time >>> import hashlib >&g ...
- javascript第八章--事件
① 事件流 ② 事件处理程序 ③ 事件对象 ④ 事件类型 ⑤ 内存和性能 ⑥ 模拟事件