2

用户登录时我已经存储了用户ID,但是我发现它有时会丢失,会话丢失的常见原因是什么?

我已经使用了超时插件(空闲一段时间会警告并帮助您注销)并且有一些 javascript 可以在页面之间传输

You have edited the list. <a href='view.php' onClick='window.location.reload()'>Back</a></div>

<input type="button" value="Back" onclick="location.href='add.php'" class="btn" style="width:100px"/> 

并取消设置会话,但这不应该是原因吗?

$(function(){
  $("#closeTab").click(function() {
            $.post("clear.php",function(data){
             window.parent.$('#tt').tabs('close','Create List'); 
             location.reload();     
      });
  });
});

清除.php

    if (isset($_SESSION['lname']))
unset($_SESSION['lname']);
if (isset($_SESSION['creminder']))
unset($_SESSION['creminder']);
if (isset($_SESSION['subscribe']))
unset($_SESSION['subscribe']);
if (isset($_SESSION['unsubscribe']))
unset($_SESSION['unsubscribe']);

这用于存储会话

$user=$_SESSION['username'];

谢谢

4

2 回答 2

1

PHP 以这种方式管理会话:

当 session_start() 在网络服务器上创建一个文件。该文件是一个文本文件,例如 session1234。在用户浏览器上设置了一个 cookie,该 cookie 包含值“session1234”。每次用户调用同一域上的页面时,浏览器都会静默发送该 cookie。

这样用户就被识别出来了,用户的会话数据就从服务器上的会话文件中取出来了。

会话过期的原因:

  1. 通常当从 web 应用程序注销时,我们使用 session_destroy() 来销毁服务器 session1234 上的文件。因此,如果用户再次使用 cookie 内容 session1234 调用站点:服务器上不存在文件 session1234(已通过注销删除),则用户未通过身份验证
  2. 发生超时:文件 session1234 从服务器默认 20 分钟删除(可在 php.ini 中配置)。如果用户再次调用该站点,与以前相同。每次用户采取行动(调用服务器)时,服务器都会更新会话文件的生存时间
  3. 用户清除浏览器 cookie(如果有人想清除浏览器的历史记录,可能会发生这种情况):cookie 丢失,浏览器不发送 cookie 服务器没有收到它并且无法验证用户身份

希望能帮助到你

于 2012-04-05T15:07:27.683 回答
1

PHP 处理会话非零到期的方式也有一个缺点。基本上,如果您将会话 cookie 设置为在 15 分钟内过期,它将在会话开始后 15 分钟过期......它不会刷新该过期时间。

要运行在用户“做某事”时刷新的会话,您需要将到期日期存储为会话变量,并在启动会话时检查该变量并在必要时重新生成会话。

我之前尝试过更新会话 cookie 中的到期日期,当会话开始时……它导致了一些有趣的问题

这是极不可能的,但有可能会话垃圾收集的生命周期也低于 cookie 到期的生命周期。有很多ini 变量可以处理其中一些常见的会话问题,您可以通过在运行时设置它们来覆盖其中的大部分:

ini_set('session.gc_maxlifetime' 900);
ini_set('session.cookie_lifetime' 0); //ALWAYS set this to 0 - so the cookie will only expire when the browser is closed
ini_set('session.cookie_domain', '.domain.ext'); //always start with a "." if you want to cover multiple sub-domains
ini_set('session.cookie_path', '/'); //always use "/" unless you want to limit the cookie to a specific path "/admin" for instance

就个人而言,我会将所有会话处理内容放入(单例模式)类中,并在构造函数中处理验证和到期。

于 2012-04-05T15:22:03.770 回答