session理解

session理解

还是那句。。。。新手上路。。大神欢迎指点

1.session的概念

其实什么是session?什么是cookie?这些都是些老掉牙的问题了。。而做过相关的开发的人,基本都知道。。而还不是很理解的,谷歌下,要理解这两个东西其实也不难。。那这里我就不去探讨这个问题了。。

2.cookie与session的关系

说下我的理解吧:

cookie和session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的;步骤大概如下:

  • 服务端执行Session机制
  • 生成对应而唯一的session_id(通过对这个session_id的解析和处理,服务端可以找到,该session保存的文件;再从文件中提取出session的信息)
  • 服务端会将这个session_id发送给客户端
  • 客户端接受到session_id,以cookie作为保存的容器保存起来
  • 客户端在每次请求的时候都会带这个session_id给服务端
  • 服务端自行解析session

注意:session保存信息的手段是多种的:缓存,数据库,文件等;但是默认是文件形式保存。。。

问题:

  1. 禁用了cookie后,session还能使用吗?
  2. app就真的不可以使用session吗?

为了探讨上面的问题。。我们先看看 session 创建和销毁的时机。。

3.创建 session和销毁session的时机

  1. 创建session的时候会附带着创建一个cookie,它的MaxAge为-1,也就是说只能存在于内存中。当浏览器端禁用cookie时,这个cookie依然会被创建。
  2. 当浏览器提交的请求中有jsessionid参数或cookie报头时,容器不再新建session,而只是找到先前的session进行关联。这里又分为两种情况:

    1)使用jsessionid。该值若能与现有的session对应,就不创建新的session,否则,仍然创建新的session。

    2)使用cookie。该值若能与现有的session对应,也不创建新的session;但若没有session与之对应(就如上面的重启服务器之后)容器会根据cookie信息恢复这个与之对应的session,就好像是以前有过一样。

  3. session何时被销毁?
    当我们关闭浏览器,再打开它,连接服务器时,服务器端会分配一个新的session,也就是说会启动一个新的会话。那么原来的session是不是被销毁了呢?我做了个小实验:

创建一个session:

//启动session的初始化
session_start();
//注册session变量,并且赋值
$_SESSION["username"] = "hello"
//输出生成的session_id
echo session_id();

访问页面创建session,获取session_id,关闭浏览器;

根据session_id创建session对象

//上面输出的session_id
$session_id = "qpk6onnn3husvotnke030ftcm4";
session_id($session_id);
session_start();
echo $_SESSION["username"];

结果可以取出 "hello"

由此可以看出:

当浏览器关闭时,原session并没有被销毁(destory方法没有执行),而是等到timeout到期,才销毁这个session。关闭浏览器只是在客户端的内存中清除了与原会话相关的cookie,再次打开浏览器进行连接时,浏览器无法发送cookie信息,所以服务器会认为是一个新的会话。因此,如果有某些与session关联的资源想在关闭浏览器时就进行清理(如临时文件等),那么应该发送特定的请求到服务器端,而不是等到session的自动清理。

4.回归问题。。

其实我的理解很简单(不对的地方欢迎指出)。。

只要有session_id就可以找到session。。。

cookie 是保存唯一识别(session_id)的手段;

禁用cookie 或者 本来就不支持cookie,但是通过其他手段,也能实现cookie实现的功能。服务器只要有session_id;还是能找到对应的session的;只是session机制,内部本来是通过cookie自动实现的。。。如果不采取cookie的话,就要自己去逻辑实现。。。感觉有点变味了,但是猪肉变质了,还是猪肉啊。。。具体看自己怎么看。。。


成长记录
记录一下自己学习到的
1 篇内容引用
315 声望
12 粉丝
0 条评论
推荐阅读
Docker-Swarm三节点部署
学习笔记1. 安装要求在开始之前,Dcoker Swarm 集群部署 机器需要满足以下几个条件:虚拟了3台机器,操作系统:Linux version 3.10.0-1127.el7.x86_64硬件配置:CPU(s)-2;3GB或更多RAM;硬盘20G左右;3台机器构成...

一只小蜗牛阅读 2.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go6阅读 2.9k评论 4

封面图
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

TANKING7阅读 11.7k评论 5

Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。

huangzhhui4阅读 1.5k评论 1

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go3阅读 837评论 2

封面图
Ajax实现搜索联想 搜索关键词提醒 无刷新搜索
通过javascript监听搜索框的内容,调用后端即可。(1)javascript监听搜索框的内容(2)把搜索框的关键词传给后端进行搜索(3)搜索到结果,遍历到页面

TANKING1阅读 4.7k

315 声望
12 粉丝
宣传栏