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保存信息的手段是多种的:缓存,数据库,文件等;可是默认是文件形式保存。。。cookie

问题:session

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

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

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

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

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

    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的话,就要本身去逻辑实现。。。感受有点变味了,可是猪肉变质了,仍是猪肉啊。。。具体看本身怎么看。。。

相关文章
相关标签/搜索