MENU

修改session的过期(生存)时间

December 8, 2019 • Read: 37 • 生活阅读设置

以下我以php为例,万变不离其宗,希望对大家都有用吧。
session与cookie:
了解过两者的众所都知道,有些信息保存到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在你想要的时间内过期,即使浏览器关闭了。