我正在使用会话构建登录/注销系统,并遇到了注销/超时功能的用户端总结问题。这是由于我构建这些函数操作的页面的方式。该页面由实际页面的中央 iFrame 构建,周围有一个顶部导航栏和两个用于导航的侧边栏。侧边栏由几个 PHP 元素组成,每个元素检查是否设置了 $_SESSION["idUser"],并且 jQuery 函数在特定元素时刷新对登录状态(菜单和仅登录内容)敏感的元素被点击。我以这种方式构建它的原因是因为该页面处理浏览器游戏,并且我希望用户停留在单个 URL 上(没有任何游戏内容的永久链接)。登录/注销按钮由 jQuery 处理,它向 PHP 文件发送 AJAX 请求,该文件处理所有用户验证并刷新侧边栏元素。当用户登录处理程序时,处理程序会重新生成会话 ID(因为页面未刷新,否则如果用户注销并在同一个位置重新登录,则会话 ID 不会改变,从我目前的经验来看)。这样,无论发生什么,当您登录时,旧的会话 id 都会丢失。注销时,PHP 处理程序取消设置 $_SESSION 变量,然后销毁会话。我想要做的是在注销/超时后显示一个通知,显示用户是否自己注销或会话是否超时。我可以使用处理按钮的 Javascript 来做到这一点——因为页面本身不会刷新,所以函数会继续运行,我可以简单地让它在某处放置一些文本。我真的很想将通知放在登录表单中,就在登录按钮的正上方,因为这是人们在检查有关登录状态的信息时会查看的地方。问题是登录表单是由按钮上的 jQuery 脚本重新加载的侧边栏元素之一。jQuery 脚本首先将 AJAX 请求发送到 PHP 处理程序,然后命令重新加载侧边栏元素。但是,如果我在 .load() 部分之后附加 .done() ,则 jQuery 不会等待内容重新加载,这意味着我不能使用相同的 jQuery 函数将一些文本放入登录表单,因为 jQuery将尝试在表单加载到页面之前添加文本。到目前为止,我想出的唯一解决方案是不破坏会话,而是设置 $_SESSION["response"]="logged out",然后让登录表单回显该值。我的问题是:a)给定页面的构造方法,有没有什么方法可以在不保留PHP会话的情况下达到这个效果?b)如果不是,在注销时不销毁会话是否安全,而仅在登录时重新生成会话 ID?jQuery代码:$(".column").on("click", "#login, #logout", function () { //This handles the login/logout buttons var formData = $(event.target).parent().parent().serialize(); //put the form data in a string if (formData !== "") { formData += "&"; } formData += event.target.id + "=" + event.target.id; $.post("/backend/validateUser.php", formData) //post the login/logout data to the handler file .done(function() { //refesh navbar and all sidebars $(".navbar, #sidebartopl, #sidebartopr, #sidebarbottoml, #sidebarbottomr").each(function(){ $(this).load("/layout/"+$(this).attr("phpsource")+".php"); }); }) if ($(this).attr("id") === "login") { $(".navbar").removeClass("collapsed"); } else if ($(this).attr("id") === "logout") { $(".navbar").addClass("collapsed"); }});
1 回答

精慕HU
TA贡献1845条经验 获得超8个赞
我找到了解决问题的方法……我可以让我的 PHP 处理程序简单地回显一些 json。这样我就可以避免整个时间问题,因为 jQuery 脚本只有在收到来自 PHP 处理程序的响应后才执行其下一个操作。
AJAX 语句现在如下所示:
$.post("/backend/validateUser.php", formData, function(data) {
switch(data.result) {
//case for each possible result from the handler (login/logout/timeout/register)
}, "json")
当 PHP 处理程序成功完成特定进程中的所有操作时,它会简单地回显一个微小的 JSON 片段:
echo json_encode(["result"=>"login"]);
添加回答
举报
0/150
提交
取消