超时后重新登录时无法识别$ _SESSION

时间:2011-04-23 13:35:32

标签: php session

我有一个包含公共和私人部分的网站。要访问私有区域,用户必须登录,这会设置会话变量。登录脚本对所有内容进行身份验证,然后将标头位置更改为专用页面:

//get info from database and if user is authorized, then redirect
session_start();
$_SESSION['authorized'] = $user;
$_SESSION['firstname'] = $first;
$_SESSION['lastname'] = $last;
$_SESSION['password'] = $pass;
$_SESSION['position'] = $position;
$_SESSION['email'] = $email;
header( "Location: index2.php" );

然后在index2.php页面上,我在顶部进行了授权检查:

session_start();
if(!isset($_SESSION['authorized'])){
header( "Location: denied_unauth.php" );
die();
}else{
//rest of page

一切都像魅力一样。除了...如果20分钟没有活动,用户必须重新登录.Dedex2.php使用jQuery将div加载到其中,因此用户永远不会离开index2.php。如果他们在不活动后单击以在私有站点上检索页面,而不是他们请求的div,则会收到“已注销”消息并再次显示登录表单。它与上面列出的脚本完全相同,设置完全相同的会话变量并将它们重定向回完全相同的页面(index2.php),这是他们登录的同一页面 - 基本上只是重新加载页面

每当我测试它时,index2.php都无法识别新会话。它每次都会向用户发送“denied_unauth.php”。这告诉我登录脚本正在运行,它识别用户名和密码并将用户发送到index2.php ...但是当页面重新加载index2.php时,会话无法被识别。我甚至尝试在URL“index2.php? somerandomnumber 的末尾添加一个随机数,以防它出现缓存问题,但它没有帮助。

有什么想法吗?

编辑:要清楚,我不是要求停止用户注销的方法。我试图弄清楚为什么,如果在日志返回脚本期间创建了新的会话变量,则在重新加载页面时它不会识别它们。会话变量是在他们第一次登录时创建的,所以我知道脚本的一部分可以工作。但是当他们在重新登录后再次返回页面时,它无法识别新的$ _SESSION ['授权']。

编辑2:这是发生的事情:

  1. 从页面index.php,用户登录。登录表单创建会话并将标头重定向到index2.php
  2. 页面index2.php检查会话是否已设置,如果没有,则会将用户踢出“拒绝访问”页面。
  3. 用户点击index2.php页面中的链接,将部分加载到主div
  4. 加载到主div中的每个文件都会检查它以查看会话是否已设置。如果会话存在,那么文件加载,如果会话过期,而不是文件,它会向用户显示登录表单并要求他们重新登录。(所有这些工作到目前为止)
  5. 当用户从此表单重新登录时,会创建一组新的会话变量。我已经尝试过设置新会话或session_regenerate_id(),但似乎都不起作用。
  6. 这个新会话不被index2.php识别,每次都会将它们踢出去。我已经尝试在登录后直接重定向到index2.php,或者只是加载他们首先请求的div,但两种方式,index2.php都没有看到会话已设置且用户最终在“拒绝访问”页面。

5 个答案:

答案 0 :(得分:0)

会话在php.ini文件中指定了超时:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; Document expires after n minutes.
session.cache_expire = 180

如果您不能或不想在服务器上全局更改,请尝试在Apache上使用.htaccess文件。

答案 1 :(得分:0)

我不确定它是否可行,但如果您无法访问php.ini或.htaccess文件, 你可能想在session_start()之后使用它:

session_regenerate_id(true);

你还应该把这个放在你的jquery加载div的页面中。

答案 2 :(得分:0)

这是一个会话终身问题。你可以通过两种方式解决这个问题。这里的描述:

  1. 更改php.ini文件。增加session.gc_maxlifetime,默认为1440,表示24分钟。你可以增加一秒。
  2. 这里没有改变php.ini文件的第二种方式。您可以使用以下代码设置会话生命周期:

    ini_set('session.gc_maxlifetime',30 * 60);

    在session_start();

答案 3 :(得分:0)

处理此问题的一种可靠方法是创建一个每隔X分钟在后台加载的ajax心跳脚本,只需要“触摸”会话。这要求所有用户都启用了JavaScript。

答案 4 :(得分:0)

我终于明白了并让它发挥作用。登录表单绑定到提交的jQuery调用,我更改了它,以便新的登录表单实际执行post调用...并且它开始工作。