以下我以 PHP 为例,万变不离其宗,希望对大家都有用吧。

了解过两者的众所都知道,有些信息保存到 cookie,有些出于安全问题就不能直接存到浏览器,这就要用到 session 了。然而对于浏览器,一般都是默认 20-30 分钟自动销毁或者关闭浏览器就会销毁。这显示是很头疼的事情,比如我们要实现用户登陆功能,关闭浏览器就要重新登陆,这搞什么鬼?所以我们要去试图改变它们。

网上众说纷纭,你可以选择去修改默认配置文件,如 PHP 为例,修改 php.ini 的函数。但是染念却不喜欢修改默认,也在网上看到某些程序员是没有权限修改的,所以我们需要做到如何不修改默认文件达到这样的功能。

我们可能在网上看到这样的一例子:

$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
  1. 通过 cookie 的有效时间来设置 session,我想说,这只是一部分,因为设置 cookie 有效期没有错,但是你没有传值,怎么达到修改 session 的生存时间呢。
  2. 虽然在你执行了一次后,真的 session 是 24 小时了,但是当你关闭浏览器后,再打开,session 仍然还是需要你重新输入,因为浏览器找不到你的 session 的 id 啊...

如何设置 session 的生存时间呢? #

要做的就是把 session 传给 cookie,由 cookie 给我们保存:

session_start();
isset($PHPSESSID) ? session_id($PHPSESSID) : $PHPSESSID = session_id();
setcookie('PHPSESSID', $PHPSESSID, time()+86400, "/");

PHP session 工作原理 以下以 cookie 传输 PHPSESSID 描述。

  1. 客户端请求一个 PHP 的服务端地址。
  2. 服务端收到请求,此次 PHP 脚本中包含 session_start()。
  3. 服务端会生成一个 PHPSESSID。(默认 session 存储方式为 session.save_handler=files,文件形式存储。生成的 session 文件名规则即为 sess_PHPSESSID,session 文件存在 session.save_path 中。)
  4. 服务端响应首部 Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一个 cookie 保存此 PHPSESSID。
  5. 此时,客户端的 cookie 里面包含了 PHPSESSID,之后客户端的每次请求首部 Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个 PHPSESSID 来找到服务端的 session 文件,通过对这个 session 文件的读写操作即实现了 session 的超全局变量属性。

如果客户端禁用了 cookie,由于无法使用 cookie 传递 PHPSESSID,那么客户端每次请求,服务端都会重新建立一个 session 文件,而无法通过通过 PHPSESSID 来重用 session 文件,所以 session 也就失效了。 这种情况可以设置 session.use_trans_sid 来传输 PHPSESSID,具体实现方式与 cookie 的区别就是将 PHPSESSID 通过 HTTP 的 GET 传输。每次请求的地址里面都会补全 PHPSESSID 参数 "url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50" 来实现。

顾名思义,PHPSESSID 就是当前会话 id,session_id($PHPSESSID) 达到当前会话,不然没存在,就要建立一个。然后再通过设置 cookie(其实你打开看 cookie,就是有 PHPSESSID 存在,而我们修改了它的存在时间而已),这样我们才能实现 session 在你想要的时间内过期,即使浏览器关闭了。