[转载]深度理解Session
什么是session
session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点:
1. session保存的位置是在服务器端
2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能
3. 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题
本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术
为什么要有session
主要的一个原因就是HTTP的无状态性
因为HTTP的无状态性,所以我们没有办法在HTTP发送请求的时候知道当前用户的状态,也就是比如说,当前是哪个用户的之类的这种信息,所以这个时候我们需要session来标识当前的状态
seesion的工作原理
接下来,通过一个模拟用户登录的流程图来初步理解session的原理,假设这个时候用户执行登录操作,具体的session工作流程如下:
整个流程大概分成这样的几步:
1. 第一步将本地的cookie中的session标识和用户名,密码带到后台中
2. 第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID
3. 没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效
3. 失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session
看到这里你可能对session的工作原理有一个初步的理解
session的原理图如下:
session的常见配置
我们这里以PHP为例来讲解一下关于session的配置
首先我们要在PHP的安装目录下面找到php.ini文件,这个文件主要的作用是对PHP进行一些配置,具体以后涉及到再详讲。
1. 设置session存放在cookie中中标识的字段名,php中默认为PHPSESSID
对应的设置为:session.name = PHPSESSID
2. 如果客户端禁用了cookie,可以通过设置session.use_trans_sid来使标识的交互方式从cookie变为url传递
对应的设置为: session.use_trans_sid = 0
3. 设置session的保存位置
对应的设置是session.save_path="D:\phpStudy\PHPTutorial\tmp\tmp"
PHP中session实战
首先我们需要安装wamp或者是phpstudy,具体方式自行百度
为了方便观察session文件的变化,我们需要找到session的保存路径(在php.ini中找到session.save_path),如下:
然后找到所指向的目录,注意一般来说session是使用files的形式来保存的,但是我们也可以根据自己的实际情况进行修改。我们可以在php.ini文件中进行修改和查看。
使用session的第一步,我们要打开session,使用session_start(),然后我们给创建的session添加一个变量,我们假设为demo1,值为default ,代码如下:
<?php
/**
* Created by PhpStorm.
* Date: 2017/12/16
*/
session_start();// 打开session
$_SESSION["demo1"] = "default";
?>
执行效果如下:
打开对应的文件,里面的内容如下:
s:7 表示的是类型为string类型,长度为7个长度的字符串
如果我们对session中的内容进行重新编辑的话,效果如下:
我们观察最近一条的修改日期,我们可以发现就是日期发生了变化,但是文件名没有变化,也就是说,修改session中的内容不会导致文件被新建,而是执行对文件的重新写入操作
session的销毁
销毁session一般有两种方式,unset和session_destroy,我们先来说说第一种
代码如下:
<?php
/**
* Created by PhpStorm.
* Date: 2017/12/16
*/
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
//session的销毁
unset($_SESSION);
?>
这一个相当于没有删除session文件,但是使得即使有对应的PHPSESSID也无法获取到相应的session
session_destroy()相对来说比较彻底,直接删除对应的session文件
<?php
/**
* Created by PhpStorm.
* Date: 2017/12/16
*/
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
var_dump(session_name());
//session的销毁
session_destroy();
?>
运行的效果如下:
对于个人来说比较推荐使用第二种方法,因为当要销毁session的时候,那么也就意味着session已经失效了,所以这个时候我们把它给删掉才是最好的处理方式,一方面可以减少对硬盘的存储,另外一方面可以相对优化session的查询速度。
好了,这个时候我们应该要设置传递给浏览器端的cookie了,默认是自动传送,但是我们应该要学习的是怎样通过后端设置cookie过去
其中有两个方法与session有关的方法我们需要记住,第一个是session_name(),这个是获取cookie的key值得,第二个是session_id,这个是session的文件名
设置的示例代码:
<?php
/**
* Created by PhpStorm.
* Date: 2017/12/16
*/
session_start();// 打开session
$_SESSION["demo1"] = "default_1";
setCookie(session_name(),session_id(),time()-1000);
?>
在设置cookie的时候,我们为了程序的安全性,我们应该要禁止JS可以对cookie进行重写,所以需要设置HTTP ONLY,具体的设置方法在Php.ini中找到session.cookie_httponly
然后将其的值设置为1或者true即可
除此之外还可以通过setCookie和ini_set()来动态设置HTTPONLY属性
在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,但是这个课程不需要人为的去参与。我们只需要保证HTTPONLY被设置就行了。下面是完整的代码:
<?php
/**
* Created by PhpStorm.
* Date: 2017/12/16
*/
session_start();// 打开session
if ($_SESSION) {
var_dump($_SESSION["demo1"]);
} else {
$_SESSION["demo1"] = "default_" . time();
var_dump($_SESSION["demo1"]);
setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true);
} ?>
session的一些相关注意事项
1. 关闭浏览器session同样存在
如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件
2. session性能瓶颈怎样解决?
如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis或者mongodb,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度
3. 一般不使用URL重写的方法来传递PHPSESSID
其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率
更多的session的相关配置请点击这里
更多的一些PHP.ini中session的含义
[Session]
session.save_handler = files
#session的存储方式
session.use_cookies= 1
#使用cookies在客户端保存会话
session.use_only_cookies = 1
#去保护URL中传送session id的用户
session.name = PHPSESSID
#session名称(默认PHPSESSID)
session.auto_start = 0
#不启用请求自动初始化session
session.cookie_lifetime = 0
#cookie存活时间(0为直至浏览器重启,单位秒)
session.cookie_path = /
#cookie的有效路径
session.cookie_domain =
#cookie的有效域名
session.cookie_httponly =
#httponly标记增加到cookie上(脚本语言无法抓取)
session.serialize_handler = php
#PHP标准序列化
session.gc_probability =1
session.gc_divisor =1000
#建议设置1000-5000
#概率=session.gc_probability/session.gc_divisor(1/1000)
#页面访问越频繁概率越小
session.gc_maxlifetime =1440
#过期时间(默认24分钟,单位秒)
session.bug_compat_42 = off
#全局初始化session变量
session.bug_compat_warn = off
session.referer_check =
#防止带有ID的外部URL
session.entopy_length = 0
#读取的字节
session.cache_limiter = {nocache,private,pblic}
#HTTP缓冲类型
session.cache_expire = 180
#文档过期时间(分钟)
session.use_trans_sid = 1
#trans_sid支持(默认0)
session.hash_function = 0
#hash方法{0:md5(128 bits),1:SHA-1(160 bits)}
session.hash_bits_per_character = 5
#当转换二进制hash数据奥可读形式是,每个字符保留位数
session.save_path =
"/var/lib/php/session"
#session id存放路径
转载自:https://www.cnblogs.com/st-leslie/p/8016951.html
[转载]深度理解Session的更多相关文章
- [serverlet][转载: 深入理解HTTP Session]
[serverlet][转载: 深入理解HTTP Session] 标签(空格分隔): 未分类 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- [转载]深入理解HTTP Session
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- 深度理解Jquery 中 offset() 方法
参考原文:深度理解Jquery 中 offset() 方法
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 理解session机制
理解session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序需要为某个客户端的请求创建一个session的时候,服务器首 ...
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- 深度解剖session运行原理
已经大半年没有更新博客了,一方面有比博客更重要的事情要做,另外一方面也没有时间来整理知识,所以希望在接下来的日子里面能够多多的写博客来与大家交流 什么是session session的官方定义是:Se ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
随机推荐
- Nature重磅:华裔科学家成功解码脑电波,AI直接从大脑中合成语音
[导读]Nature发表华裔作者论文:通过解码大脑活动提升语音的清晰度,使用深度学习方法直接从大脑信号中产生口语句子,达到150个单词,接近正常人水平. 大脑活动能够解码成语音了. 说话似乎是一项毫不 ...
- 从零开始的JSON库
从零开始的JSON库 项目地址 jsoncpp ,此项目受到 leptjson 启发,实现了最基本的功能,仅作学习使用. 提供简单的 parse() 和 generate() 方法将 JSON 文本解 ...
- CocoaPods 安装卸载
建议升级10.15的系统,什么都装好了 sudo gem install cocoapods pod setup搞定不能有search命令,可以pod init,下载用的是cdn,打开项目正常使用 问 ...
- 2020.4.4号全国疫情哀悼日网页变灰色前端是如何实现的?-pink老师
今天是4.4疫情哀悼日,纪念疫情期间牺牲的烈士和逝世同胞,因此大部分网站颜色都变灰色了,我们前端是如何实现的呢? 核心原理,使用css3的滤镜效果即可,filter grayscale 将整个界面变为 ...
- 将Python执行代码打包成exe可执行文件
安装pyinstaller pip3 install pyinstaller 进入py文件目录,执行以下指令 pyinstaller -F -w <文件名.py>,-F代表生成可执行文件, ...
- Codeforces 1322C - Instant Noodles(数学)
题目链接 题意 给出一个二分图, 两边各 n 个点, 共 m 条边, n, m ≤ 5e5. 右边的点具有权值 \(c_i\), 对于一个只包含左边的点的点集 S, 定义 N(S) 为所有与这个点集相 ...
- A 现代艺术
时间限制 : - MS 空间限制 : 165536 KB 评测说明 : 1s 问题描述 何老板是一个现代派的艺术家.他在一块由n*n的方格构成的画布上作画.一开始,所有格子里的数字都是0.何老板 ...
- 使用vant的时候,报错:component has been registered but not used以及vant的使用方法总结
使用vant的时候,报错:component has been registered but not used以及vant的使用方法总结 在使用vant的时候. 想按需引入,于是安装了babel-pl ...
- 【前端】HTML总结
一. HTML介绍:---------------------------------------1. 什么是HTML? 超文本标记语言, <标签名>--标记(标签.节点) 2. ...
- Hadoop(十):本地IDEA链接远程Hadoop
本文使用的Hadoop为2.7.7,版本如果不同要下载相应版本的文件 配置本地的Hadoop库(不需完整安装,但是要有环境支持) 下载文件 https://github.com/speedAngel/ ...