我有一个包含公共和私人部分的网站。要访问私有区域,用户必须登录,这会设置会话变量。登录脚本对所有内容进行身份验证,然后将标头位置更改为专用页面:
//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:这是发生的事情:
答案 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)
这是一个会话终身问题。你可以通过两种方式解决这个问题。这里的描述:
这里没有改变php.ini文件的第二种方式。您可以使用以下代码设置会话生命周期:
ini_set('session.gc_maxlifetime',30 * 60);
在session_start();
答案 3 :(得分:0)
处理此问题的一种可靠方法是创建一个每隔X分钟在后台加载的ajax心跳脚本,只需要“触摸”会话。这要求所有用户都启用了JavaScript。
答案 4 :(得分:0)
我终于明白了并让它发挥作用。登录表单绑定到提交的jQuery调用,我更改了它,以便新的登录表单实际执行post调用...并且它开始工作。