114

session理解 - 成长记录 - SegmentFault

 6 years ago
source link: https://segmentfault.com/a/1190000011397777
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
发布于 2017-09-28

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的话,就要自己去逻辑实现。。。感觉有点变味了,但是猪肉变质了,还是猪肉啊。。。具体看自己怎么看。。。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK